quick comparison on deposited and reprocessed bigwig files
corr_df <- data.frame(data.frame(cov.combined)[,c(9,6,7,8)],data.frame(cov.geo)[,6:8],data.frame(cov.mocks)[,6:7],data.frame(cov.pds)[,6:7],data.frame(cov.pdc)[,6:7])
res <- cor(corr_df[,2:13])
corrplot(res, type = "upper", order = "hclust",tl.col = "black", tl.srt = 45,addCoef.col = 'black',tl.pos = 'd', cl.pos = 'n', col.lim=c(0.93, 1),is.corr = F, method = 'color')

p1 <- plot_bw_profile(c(mocks_bigwigs[1],pds_bigwigs[1],pdc_bigwigs[1]),loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed",mode = "center",verbose = F) + coord_cartesian(ylim=c(0,2.4))
p2 <- plot_bw_profile(c(mocks_bigwigs[2],pds_bigwigs[2],pdc_bigwigs[2]),loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed",mode = "center",verbose = F) + coord_cartesian(ylim=c(0,2.4))
p1 <- plot_bw_profile(bwfiles = geo_bigwigs,loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed",mode = "center",verbose = F) + coord_cartesian(ylim=c(0,5))
p2 <- plot_bw_profile(bwfiles = combined_bigwigs,loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed",mode = "center",verbose = F) + coord_cartesian(ylim=c(0,2.6))
ggarrange(p1,p2, ncol=2)

p1 <- plot_bw_profile(bwfiles = geo_bigwigs,loci = "../data/peaks/CTCF-only_with_promoters_sorted.bed",mode = "center",verbose = F) + coord_cartesian(ylim=c(0,5))
Warning in .summarize_matrix(fg, label) :
Profile plot: 324 generated ( 0.0538563829787234 per locus)
Warning in .summarize_matrix(fg, label) :
Profile plot: 324 generated ( 0.0538563829787234 per locus)
Warning in .summarize_matrix(fg, label) :
Profile plot: 324 generated ( 0.0538563829787234 per locus)
p2 <- plot_bw_profile(bwfiles = combined_bigwigs,loci = "../data/peaks/CTCF-only_with_promoters_sorted.bed",mode = "center",verbose = F) + coord_cartesian(ylim=c(0,2.6))
Warning in .summarize_matrix(fg, label) :
Profile plot: 324 generated ( 0.0538563829787234 per locus)
Warning in .summarize_matrix(fg, label) :
Profile plot: 324 generated ( 0.0538563829787234 per locus)
Warning in .summarize_matrix(fg, label) :
Profile plot: 324 generated ( 0.0538563829787234 per locus)
ggarrange(p1,p2, ncol=2)

p1 <- plot_bw_loci_scatter(mocks_bigwigs[1],mocks_bigwigs[2], loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed", verbose = F)
p2 <- plot_bw_loci_scatter(pds_bigwigs[1],pds_bigwigs[2], loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed", verbose = F)
p3 <- plot_bw_loci_scatter(pdc_bigwigs[1],pdc_bigwigs[2], loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed", verbose = F)
ggarrange(p1,p2,p3, ncol=3)

p1 <- plot_bw_loci_scatter(combined_bigwigs[1],combined_bigwigs[2], loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed", verbose = F)
p2 <- plot_bw_loci_scatter(combined_bigwigs[2],combined_bigwigs[3], loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed", verbose = F)
p3 <- plot_bw_loci_scatter(combined_bigwigs[1],combined_bigwigs[3], loci = "../data/peaks/G4_CTCF_with_promoters_sorted.bed", verbose = F)
ggarrange(p1,p2,p3, ncol=3)

results <- data.frame(
as.data.frame(cov.mocks),
as.data.frame(cov.pds)[6:7],
as.data.frame(cov.pdc)[6:7],
as.data.frame(cov.G4)[6],
raw.lfc.pds_1 = log2(cov.pds$PDS_1 / cov.mocks$mock_1),
raw.lfc.pds_2 = log2(cov.pds$PDS_2 / cov.mocks$mock_2),
raw.lfc.pdc_1 = log2(cov.pds$PDS_1 / cov.mocks$mock_1),
raw.lfc.pdc_2 = log2(cov.pdc$PhenDC3_2 / cov.mocks$mock_2),
raw.lfc.pds = log2(rowMeans(as.data.frame(cov.pds)[6:7]) / rowMeans(as.data.frame(cov.mocks)[6:7])),
raw.lfc.pdc = log2(rowMeans(as.data.frame(cov.pdc)[6:7]) / rowMeans(as.data.frame(cov.mocks)[6:7])),
mean.mock = rowMeans(as.data.frame(cov.mocks)[6:7]),
mean.pds = rowMeans(as.data.frame(cov.pds)[6:7]),
mean.pdc = rowMeans(as.data.frame(cov.pdc)[6:7])
)
cov.mocks$name <- NULL
cov.pds$name <- NULL
cov.pdc$name <- NULL
de_pds <- bw_granges_diff_analysis(cov.mocks, cov.pds, "Mock", "PDS")
converting counts to integer mode
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
lfc_pds = DESeq2::lfcShrink(de_pds, coef = "condition_PDS_vs_Mock", type = "apeglm")
using 'apeglm' for LFC shrinkage. If used in published research, please cite:
Zhu, A., Ibrahim, J.G., Love, M.I. (2018) Heavy-tailed prior distributions for
sequence count data: removing the noise and preserving large differences.
Bioinformatics. https://doi.org/10.1093/bioinformatics/bty895
de_pdc <- bw_granges_diff_analysis(cov.mocks, cov.pdc, "Mock", "PhenDC3")
converting counts to integer mode
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
lfc_pdc = DESeq2::lfcShrink(de_pdc, coef = "condition_PhenDC3_vs_Mock", type = "apeglm")
using 'apeglm' for LFC shrinkage. If used in published research, please cite:
Zhu, A., Ibrahim, J.G., Love, M.I. (2018) Heavy-tailed prior distributions for
sequence count data: removing the noise and preserving large differences.
Bioinformatics. https://doi.org/10.1093/bioinformatics/bty895
results$deseq.lfc.pds <- results(de_pds)$log2FoldChange
results$deseq.lfcs.pds <- lfc_pds$log2FoldChange
results$deseq.padj.pds <- lfc_pds$padj
results$deseq.mean.pds <- log2(lfc_pds$baseMean)
results$deseq.sig.pds <- lfc_pds$pvalue < 0.05
results$deseq.lfc.pdc <- results(de_pdc)$log2FoldChange
results$deseq.lfcs.pdc <- lfc_pdc$log2FoldChange
results$deseq.padj.pdc <- lfc_pdc$padj
results$deseq.mean.pdc <- log2(lfc_pdc$baseMean)
results$deseq.sig.pdc <- lfc_pdc$pvalue < 0.05
results$class <- gsub(" .+", "", results$name)
results$pro <- gsub(".+ ", "", results$name)
results$pro <- factor(results$pro, levels = c("Pro", "noPro"))
results$class <- factor(results$class, levels = c("CTCF_and_G4", "CTCF_not_G4"))
results$log2.mock <- log2(results$mean.mock)
results$log2.pds <- log2(results$mean.pds)
results$log2.pdc <- log2(results$mean.pdc)
results$log2.G4 <- log2(results$G4_NT)
results$deseq.sigup.pds <- results$deseq.sig.pds &
results$deseq.lfc.pds > 0
results$deseq.sigup.pdc <- results$deseq.sig.pdc &
results$deseq.lfc.pdc > 0
write.table(results, glue("{result_folder}foldchange_results.txt"))
table(results$name)
CTCF_and_G4 noPro CTCF_and_G4 Pro CTCF_not_G4 noPro CTCF_not_G4 Pro
998 1314 43304 6013
#results <- read.table("foldchange_results.txt")
results$class <- factor(results$class, levels = c("CTCF_and_G4", "CTCF_not_G4"))
p <- ggviolin(
results,
x = "class",
y = "mean.mock",
fill = "class",
palette = mypal,
add = "median_iqr"
) + coord_cartesian(ylim = c(0, 10))
annotate_figure(p, fig.lab = "CTCF signal by class in mock condition, mean of two reps, median+iqr", fig.lab.size = 6)

ggsave(glue("{plot_folder}Violin_CTCF_classes.pdf"), last_plot())
Saving 3 x 3 in image
p <- ggviolin(
results,
x = "class",
y = "mean.mock",
fill = "pro",
palette = mypal,
add = "median_iqr"
) + coord_cartesian(ylim = c(0, 10))
annotate_figure(p, fig.lab = "CTCF signal by class in mock condition, mean of two reps, median+iqr", fig.lab.size = 6)

ggsave(glue("{plot_folder}Violin_CTCF_classes_pro.pdf"),
last_plot())
Saving 3 x 3 in image
mdf <- reshape2::melt(dplyr::select(
results,
c(
"class",
"mock_1",
"mock_2",
"PDS_1",
"PDS_2",
"PhenDC3_1",
"PhenDC3_2"
)
))
Using class as id variables
ggboxplot(
mdf,
x = "variable",
y = "value",
fill = "class",
palette = mypal
) + coord_cartesian(ylim = c(0, 10))

ggsave(glue("{plot_folder}Boxplot_CTCF_reps.pdf"), last_plot())
Saving 5 x 3 in image
mdf <- reshape2::melt(dplyr::select(
results,
c(
"class",
"mock_1",
"mock_2",
"PDS_1",
"PDS_2",
"PhenDC3_1",
"PhenDC3_2"
)
))
Using class as id variables
mdf_stats_class = compare_means(value ~ class, group.by = "variable", data = mdf)
ggviolin(
mdf,
x = "variable",
y = "value",
fill = "class",
palette = mypal,
add = "median_iqr"
) + coord_cartesian(ylim = c(0, 10))

ggsave(glue("{plot_folder}Violin_CTCF_reps.pdf"), last_plot())
Saving 5 x 3 in image
mdf <- reshape2::melt(dplyr::select(results, c(
"class", "deseq.lfc.pds", "deseq.lfc.pdc"
)))
Using class as id variables
p <- ggviolin(
mdf,
x = "variable",
y = "value",
fill = "class",
palette = mypal,
add = "median_iqr"
) + geom_hline(yintercept = 0, linetype = "dotted") + coord_cartesian(ylim =
c(-3, 3)) + stat_compare_means(aes(group = class), label.y = 3, size = 2)
annotate_figure(p, fig.lab = "DESEq foldchange mean treat vs mean mock, median+iqr", fig.lab.size = 6)
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_summary()`).
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_compare_means()`).

ggsave(
glue("{plot_folder}Violin_CTCF_lfc.pdf"),
last_plot(),
width = 5,
height = 5
)
p <- ggboxplot(
mdf,
x = "variable",
y = "value",
fill = "class",
palette = mypal
) + geom_hline(yintercept = 0, linetype = "dotted") + coord_cartesian(ylim =
c(-2, 2))
annotate_figure(p, fig.lab = "DESEq foldchange mean treat vs mean mock, median+iqr", fig.lab.size = 6)
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_boxplot()`).

ggsave(glue("{plot_folder}Boxplot_CTCF_lfc.pdf"), last_plot())
Saving 3 x 3 in image
mdf <- reshape2::melt(dplyr::select(results, c(
"pro", "class", "deseq.lfc.pds", "deseq.lfc.pdc"
)))
Using pro, class as id variables
mdf$pro <- factor(mdf$pro, levels = c("Pro", "noPro"))
mdf$x <- as.factor(paste0(mdf$class, " ", mdf$variable))
mdf$x <- factor(mdf$x, levels = levels(mdf$x)[c(2, 1, 4, 3)])
p <- ggviolin(
mdf,
x = "x",
y = "value",
fill = "class",
palette = mypal,
add = "median_iqr",
facet.by = "pro"
) + geom_hline(yintercept = 0, linetype = "dotted") + coord_cartesian(ylim =
c(-2, 2)) + theme(axis.text.x = element_text(angle = 90, hjust = 1))
annotate_figure(p, fig.lab = "DESEq foldchange mean treat vs mean mock, median+iqr", fig.lab.size = 6)
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_summary()`).

ggsave(glue("{plot_folder}Violin_CTCF_lfc_pro.pdf"), last_plot())
Saving 5 x 6 in image
med <- aggregate(deseq.lfc.pds ~ class,
data = results,
FUN = "median",
na.rm = T)
med$deseq.fc.pds <- 2 ^ med$deseq.lfc.pds
med
med <- aggregate(deseq.lfc.pds ~ name,
data = results,
FUN = "median",
na.rm = T)
med$deseq.fc.pds <- 2 ^ med$deseq.lfc.pds
med
med <- aggregate(deseq.lfc.pds ~ class,
data = results,
FUN = "median",
na.rm = T)
med$deseq.fc.pds <- 2 ^ med$deseq.lfc.pds
med
med <- aggregate(deseq.lfc.pdc ~ name,
data = results,
FUN = "median",
na.rm = T)
med$deseq.fc.pdc <- 2 ^ med$deseq.lfc.pdc
med
deseq_lfc_stats = compare_means(deseq.lfc.pds ~ class, data = results)
deseq_lfc_stats
write_tsv(deseq_lfc_stats,
glue("{stat_output}pds-deseq2_lfc_statistics.tsv"))
deseq_lfc_stats = compare_means(deseq.lfc.pdc ~ class, data = results)
deseq_lfc_stats
write_tsv(deseq_lfc_stats,
glue("{stat_output}phendc-deseq2_lfc_statistics.tsv"))
mdf <- reshape2::melt(dplyr::select(
results,
c(
"class",
"raw.lfc.pds_1",
"raw.lfc.pds_2",
"raw.lfc.pdc_1",
"raw.lfc.pdc_2"
)
))
Using class as id variables
ggviolin(
mdf,
x = "variable",
y = "value",
fill = "class",
palette = mypal,
add = "median_iqr"
) + geom_hline(yintercept = 0, linetype = "dotted") + coord_cartesian(ylim =
c(-3, 3)) +
stat_compare_means(aes(group = class), label.y = 3.6, size = 2)
Warning: Removed 469 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 469 rows containing non-finite outside the scale range (`stat_summary()`).
Warning: Removed 469 rows containing non-finite outside the scale range
(`stat_compare_means()`).

ggsave(glue("{plot_folder}Violin_CTCF_lfc_individual_reps.pdf"), last_plot())
Saving 5 x 3 in image
Warning: Removed 469 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 469 rows containing non-finite outside the scale range (`stat_summary()`).
Warning: Removed 469 rows containing non-finite outside the scale range
(`stat_compare_means()`).
ggdensity(
results,
x = "raw.lfc.pds",
color = "class",
fill = "class",
palette = mypal
) + geom_vline(xintercept = 0, linetype = "dotted")
Warning: Removed 26 rows containing non-finite outside the scale range (`stat_density()`).

ggdensity(
results,
x = "raw.lfc.pdc",
color = "class",
fill = "class",
palette = mypal
) + geom_vline(xintercept = 0, linetype = "dotted")
Warning: Removed 23 rows containing non-finite outside the scale range (`stat_density()`).

ggscatter(
results,
x = "log2.mock",
y = "log2.pds",
size = 1,shape=20,
alpha = 0.1,
color = "deseq.sig.pds",
palette = mypal[c(5, 2)]
)

ggsave(glue("{plot_folder}Scatter_CTCF_DESEq_PDSvsMock.pdf"), rasterize(last_plot(),dpi = 600),width = 3, height= 3.2)
ggscatter(
results,
x = "log2.mock",
y = "log2.pdc",
size = 1,shape=20,
alpha = 0.1,
color = "deseq.sig.pdc",
palette = mypal[c(5, 2)]
)

ggsave(glue("{plot_folder}Scatter_CTCF_DESEq_PhenDC3vsMock.pdf"), rasterize(last_plot(),dpi = 600),width = 3, height= 3.2)
tb <- table(results$class)
deseq.stats <- as.data.frame(t(as.matrix(tb)))
deseq.stats[1,] <- colSums(deseq.stats)
rownames(deseq.stats) <- c("Total")
deseq.stats.percent <- deseq.stats
deseq.stats.percent[1,] <- c(100,100)
tb
CTCF_and_G4 CTCF_not_G4
2312 49317
tb <- table(results$deseq.sig.pds &
(results$deseq.lfc.pds > 0),
results$class)
deseq.stats <- rbind(deseq.stats, PDS.sig.up = as.data.frame.matrix(tb)[2,])
tb
CTCF_and_G4 CTCF_not_G4
FALSE 2202 46826
TRUE 110 2488
tb <- prop.table(table(results$deseq.sig.pds &
(results$deseq.lfc.pds > 0),
results$class),margin = 2)*100
deseq.stats.percent <- rbind(deseq.stats.percent, PDS.sig.up = as.data.frame.matrix(tb)[2,])
tb
CTCF_and_G4 CTCF_not_G4
FALSE 95.242215 94.954780
TRUE 4.757785 5.045220
table(results$deseq.sig.pds &
(results$deseq.lfc.pds > 0),
results$class)
CTCF_and_G4 CTCF_not_G4
FALSE 2202 46826
TRUE 110 2488
mdf <- reshape2::melt(table(
results$deseq.sig.pds & (results$deseq.lfc.pds > 0),
results$class
))
ggplot(mdf, aes(Var1, Var2, fill = value)) +
geom_tile(show.legend = F) + geom_text(aes(label = value)) +
scale_fill_gradient(low = "white", high = "orange") + theme_minimal()

vl <- list(
sig = grep("TRUE", results$deseq.sigup.pds),
CTCF_G4 = grep("and", results$class),
CTCFonly = grep("not", results$class)
)
plot(euler(vl), quantities = T)

tb <- table(results$deseq.sig.pdc &
(results$deseq.lfc.pdc > 0),
results$class)
deseq.stats <- rbind(deseq.stats, PhenDC3.sig.up = as.data.frame.matrix(tb)[2,])
tb
CTCF_and_G4 CTCF_not_G4
FALSE 2237 48550
TRUE 75 767
table(results$deseq.sig.pdc &
(results$deseq.lfc.pdc < 0),
results$class)
CTCF_and_G4 CTCF_not_G4
FALSE 2305 49155
TRUE 7 162
tb <- prop.table(table(results$deseq.sig.pdc &
(results$deseq.lfc.pdc > 0),
results$class),margin = 2)*100
deseq.stats.percent <- rbind(deseq.stats.percent, PhenDC3.sig.up = as.data.frame.matrix(tb)[2,])
tb
CTCF_and_G4 CTCF_not_G4
FALSE 96.756055 98.444755
TRUE 3.243945 1.555245
table(results$deseq.sig.pdc &
(results$deseq.lfc.pdc > 0),
results$class)
CTCF_and_G4 CTCF_not_G4
FALSE 2237 48550
TRUE 75 767
mdf <- reshape2::melt(table(
results$deseq.sig.pdc & (results$deseq.lfc.pdc > 0),
results$class
))
ggplot(mdf, aes(Var1, Var2, fill = value)) +
geom_tile(show.legend = F) + geom_text(aes(label = value)) +
scale_fill_gradient(low = "white", high = "orange") + theme_minimal()

results$uid <- seq(1:nrow(results))
vl <- list(
sig = grep("TRUE", results$deseq.sigup.pdc),
CTCF_G4 = grep("and", results$class),
CTCFonly = grep("not", results$class)
)
plot(euler(vl), quantities = T)

table(results$deseq.sigup.pds, results$deseq.sigup.pdc)
FALSE TRUE
FALSE 48558 470
TRUE 2226 372
mdf <- reshape2::melt(table(results$deseq.sigup.pds, results$deseq.sigup.pdc))
ggplot(mdf, aes(Var1, Var2, fill = value)) +
geom_tile(show.legend = F) + geom_text(aes(label = value)) +
scale_fill_gradient(low = "white", high = "orange") + theme_minimal()

tb <- table(results$deseq.sigup.pds & results$deseq.sigup.pdc,
results$class)
deseq.stats <- rbind(deseq.stats, both.sig.up = as.data.frame.matrix(tb)[2,])
tb
CTCF_and_G4 CTCF_not_G4
FALSE 2282 48975
TRUE 30 342
tb <- prop.table(table(results$deseq.sigup.pds & results$deseq.sigup.pdc,
results$class),margin = 2)*100
deseq.stats.percent <- rbind(deseq.stats.percent, both = as.data.frame.matrix(tb)[2,])
tb
CTCF_and_G4 CTCF_not_G4
FALSE 98.7024221 99.3065272
TRUE 1.2975779 0.6934728
table(results$deseq.sigup.pds & results$deseq.sigup.pdc, results$class)
CTCF_and_G4 CTCF_not_G4
FALSE 2282 48975
TRUE 30 342
mdf <- reshape2::melt(table(results$deseq.sigup.pds & results$deseq.sigup.pdc, results$class))
ggplot(mdf, aes(Var1, Var2, fill = value)) +
geom_tile(show.legend = F) + geom_text(aes(label = value)) +
scale_fill_gradient(low = "white", high = "orange") + theme_minimal()

deseq.stats$class <- rownames(deseq.stats)
mdf <- reshape2::melt(deseq.stats)
Using class as id variables
ggplot(mdf, aes(variable, class, fill = value)) +
geom_tile(show.legend = F) + geom_text(aes(label = value)) +
scale_fill_gradient(low = "white", high = "orange") + theme_minimal()

ggsave(glue("{plot_folder}Table_CTCF_DESEq_Sigup.pdf"), rasterize(last_plot(),dpi = 600),width = 2.5, height= 2.5)
deseq.stats.percent$class <- rownames(deseq.stats.percent)
mdf <- reshape2::melt(deseq.stats.percent[-1,])
Using class as id variables
ggplot(mdf, aes(variable, class, fill = value)) +
geom_tile(show.legend = F) + geom_text(aes(label = round(mdf$value,2))) +
scale_fill_gradient(low = "white", high = "orange") + theme_minimal()
Warning: Use of `mdf$value` is discouraged.
ℹ Use `value` instead.

ggsave(glue("{plot_folder}Table_CTCF_DESEq_Sigup_percent.pdf"), rasterize(last_plot(),dpi = 600),width = 2.5, height= 2.5)
Warning: Use of `mdf$value` is discouraged.
ℹ Use `value` instead.
vl <- list(
sig_PDS = grep("TRUE", results$deseq.sigup.pds),
sig_PDC = grep("TRUE", results$deseq.sigup.pdc),
CTCF_G4 = grep("and", results$class),
CTCFonly = grep("not", results$class)
)
plot(euler(vl), quantities = T)

results$uid <- seq(1:nrow(results))
vl <- list(
sig_PDS = grep("TRUE", results$deseq.sigup.pds),
sig_PDC = grep("TRUE", results$deseq.sigup.pdc),
CTCF_G4 = grep("and", results$class)
)
plot(euler(vl), quantities = T)

results$sig.by.class.pds <- paste0(results$deseq.sigup.pds, "_", results$class)
results$psize <- 0.01
results$psize[results$deseq.sigup.pds &
results$class == "CTCF_and_G4"] <- 1
ggscatter(
results,
x = "log2.mock",
y = "log2.pds",
size = 0.5,
alpha = results$psize,
color = "sig.by.class.pds",
palette = c(mypal[5], mypal[5], mypal[5], mypal[2], mypal[1])
)

ggscatter(
results[!grepl("NA", results$sig.by.class.pds), ],
x = "log2.mock",
y = "deseq.lfc.pds",
size = 0.2,
alpha = "psize",
color = "sig.by.class.pds",
palette = c("#505050", "#505050", "red2", "blue")
)

ggscatterhist(
results[!grepl("NA", results$sig.by.class.pds), ],
x = "log2.mock",
y = "log2.pds",
size = 0.4,
alpha = "psize",
color = "sig.by.class.pds",
margin.params = list(
fill = "sig.by.class.pds",
color = "black",
size = 0.2
),
palette = c("#505050", "#505050", "red2", "blue")
)
Warning: Removed 13 rows containing non-finite outside the scale range (`stat_density()`).
Warning: Removed 10 rows containing non-finite outside the scale range (`stat_density()`).


ggscatter(
results,
x = "raw.lfc.pds",
y = "log2.G4",
size = 0.2,
alpha = 0.1,
color = "deseq.sig.pds",
cor.coef = T,
palette = c("#888888",mypal[2])
)
Warning: Removed 16801 rows containing non-finite outside the scale range (`stat_cor()`).
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_point()`).

ggsave(glue("{plot_folder}Scatter_G4_vs_LFC_PDS.pdf"),
plot = rasterize(last_plot()))
Saving 3 x 3 in image
Warning: Removed 16801 rows containing non-finite outside the scale range (`stat_cor()`).
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_point()`).
ggscatter(
results,
x = "raw.lfc.pdc",
y = "log2.G4",
size = 0.2,
alpha = 0.1,
color = "deseq.sig.pdc",
cor.coef = T,
palette = c("#888888",mypal[2])
)
Warning: Removed 16798 rows containing non-finite outside the scale range (`stat_cor()`).

ggsave(glue("{plot_folder}Scatter_G4_vs_LFC_PDC.pdf"),
plot = rasterize(last_plot()))
Saving 3 x 3 in image
Warning: Removed 16798 rows containing non-finite outside the scale range (`stat_cor()`).
results$G4.quantile <- dplyr::ntile(results$G4_NT, n = 5)
results$pds.quantile <- dplyr::ntile(results$mean.pds-results$mean.mock, n = 4)
results$pdc.quantile <- dplyr::ntile(results$mean.pdc-results$mean.mock, n = 4)
top25.pds <- makeGRangesFromDataFrame(results[results$pds.quantile==4,1:3],na.rm=T)
bot75.pds <- makeGRangesFromDataFrame(results[results$pds.quantile!=4,1:3],na.rm=T)
top25.pds.CTCF_G4 <- makeGRangesFromDataFrame(results[(results$pds.quantile==4 & results$class == "CTCF_and_G4"),1:3],na.rm=T)
top25.pds.CTCF_only <- makeGRangesFromDataFrame(results[(results$pds.quantile==4 & results$class == "CTCF_not_G4"),1:3],na.rm=T)
top25.pdc <- makeGRangesFromDataFrame(results[results$pdc.quantile==4,1:3],na.rm=T)
bot75.pdc <- makeGRangesFromDataFrame(results[results$pdc.quantile!=4,1:3],na.rm=T)
top25.pdc.CTCF_G4 <- makeGRangesFromDataFrame(results[(results$pdc.quantile==4 & results$class == "CTCF_and_G4"),1:3],na.rm=T)
top25.pdc.CTCF_only <- makeGRangesFromDataFrame(results[(results$pdc.quantile==4 & results$class == "CTCF_not_G4"),1:3],na.rm=T)
vl <- list(
CTCF_G4 = top25.pds.CTCF_G4,
CTCF_only = top25.pds.CTCF_only,
G4motif = rtracklayer::import("../data/peaks/G4H_mm10_1.75.bed")
)
bedscout::plot_euler(grlist = vl,names = c("CTCF_G4","CTCF_only","G4motif"))

ggviolin(
results,
x = "pds.quantile",
y = "deseq.lfc.pds",
fill = mypal[3],
add = "median_iqr"
) + coord_cartesian(ylim = c(-1.5, 1.5)) + geom_hline(yintercept = 0, linetype =
"dotted")
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_summary()`).

ggsave(glue("{plot_folder}Violin_lfcPDS_by_PDSquantile.pdf"),
plot = last_plot())
Saving 3 x 3 in image
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 3 rows containing non-finite outside the scale range (`stat_summary()`).
ggviolin(
results,
x = "pdc.quantile",
y = "deseq.lfc.pdc",
fill = mypal[3],
add = "median_iqr"
) + coord_cartesian(ylim = c(-1.5, 1.5)) + geom_hline(yintercept = 0, linetype =
"dotted")

ggsave(glue("{plot_folder}Violin_lfcPDS_by_PhenDC3quantile.pdf"),
plot = last_plot())
Saving 3 x 3 in image
tb <- table(results$pds.quantile, results$class)
tb
CTCF_and_G4 CTCF_not_G4
1 440 12468
2 523 12384
3 544 12363
4 805 12102
ggbarplot(as.data.frame(t(as.matrix(tb))),"Var2","Freq",fill="Var1",palette = c(mypal[1],"#aaaaaa"),label = TRUE, lab.pos="in",ylim=c(11000,13000))

ggsave(glue("{plot_folder}Barplot_peakCat_by_PDSquantile.pdf"),
plot = last_plot())
Saving 4 x 3 in image
G4.motifs <- rtracklayer::import('../data/peaks/G4H_mm10_1.75.bed')
G4.motifs$type = rep("G4",length(G4.motifs))
ol <- bedscout::annotate_overlapping_features( makeGRangesFromDataFrame(results[,1:3],na.rm=T),feat_gr = G4.motifs,name_field = "type")$nearby_features
ol[is.na(ol)] <- "none"
tb <- table(results$pds.quantile,Var1=ol)
tb
Var1
G4 none
1 2072 10836
2 1985 10922
3 1879 11028
4 1686 11221
ggbarplot(as.data.frame(t(as.matrix(tb))),"Var2","Freq",fill="Var1",palette = c(mypal[1],"#aaaaaa"),label = TRUE, lab.pos="in",ylim=c(11000,13000))

ggsave(glue("{plot_folder}Barplot_G4motif_by_PDSquantile.pdf"),
plot = last_plot())
Saving 4 x 3 in image
table(ol,results$pds.quantile, results$class)
, , = CTCF_and_G4
ol 1 2 3 4
G4 160 183 173 209
none 280 340 371 596
, , = CTCF_not_G4
ol 1 2 3 4
G4 1912 1802 1706 1477
none 10556 10582 10657 10625
tb <- table(results$pdc.quantile, results$class)
tb
ggbarplot(as.data.frame(t(as.matrix(tb))),"Var2","Freq",fill="Var1",palette = c(mypal[1],"#aaaaaa"),label = TRUE, lab.pos="in",ylim=c(11000,13000))
ggsave(glue("{plot_folder}Barplot_peakCat_by_PhenDC3quantile.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_bigwigs,loci = top25.pds, mode = "center",verbose = F, colors = mypal) + coord_cartesian(ylim=c(0,6))
p2 <- plot_bw_profile(bwfiles = geo_bigwigs,loci = bot75.pds, mode = "center",verbose = F, colors = mypal) + coord_cartesian(ylim=c(0,6))
ggarrange(p1,p2, ncol=2)
ggsave(glue("{plot_folder}Profile_CTCF_top25_PDSquantile.pdf"),
plot = last_plot())
top25.pdc <- makeGRangesFromDataFrame(results[results$pdc.quantile==4,1:3],na.rm=T)
bot75.pdc <- makeGRangesFromDataFrame(results[results$pdc.quantile!=4,1:3],na.rm=T)
p1 <- plot_bw_profile(bwfiles = geo_bigwigs,loci = top25.pdc, mode = "center",verbose = F, colors = mypal) + coord_cartesian(ylim=c(0,6))
p2 <- plot_bw_profile(bwfiles = geo_bigwigs,loci = bot75.pdc, mode = "center",verbose = F, colors = mypal) + coord_cartesian(ylim=c(0,6))
ggarrange(p1,p2, ncol=2)
ggsave(glue("{plot_folder}Profile_CTCF_top25_PhenDC3quantile.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_bigwigs[1:3],loci = top25.pds.CTCF_G4, mode = "center",verbose = F, colors = mypal) + coord_cartesian(ylim=c(0,10))
p2 <- plot_bw_profile(bwfiles = geo_bigwigs[1:3],loci = top25.pds.CTCF_only, mode = "center",verbose = F, colors = mypal) + coord_cartesian(ylim=c(0,10))
ggarrange(p1,p2, ncol=2)
ggsave(glue("{plot_folder}Profile_CTCF_top25_PDSquantile_byG4overlap.pdf"),
plot = last_plot())
top25.pdc.CTCF_G4 <- makeGRangesFromDataFrame(results[(results$pdc.quantile==4 & results$class == "CTCF_and_G4"),1:3],na.rm=T)
top25.pdc.CTCF_only <- makeGRangesFromDataFrame(results[(results$pdc.quantile==4 & results$class == "CTCF_not_G4"),1:3],na.rm=T)
p1 <- plot_bw_profile(bwfiles = geo_bigwigs[c(1,3)],loci = top25.pdc.CTCF_G4, mode = "center",verbose = F, colors = mypal[c(1,3)]) + coord_cartesian(ylim=c(0,10))
p2 <- plot_bw_profile(bwfiles = geo_bigwigs[c(1,3)],loci = top25.pdc.CTCF_only, mode = "center",verbose = F, colors = mypal[c(1,3)]) + coord_cartesian(ylim=c(0,10))
ggarrange(p1,p2, ncol=2)
ggsave(glue("{plot_folder}Profile_CTCF_top25_PhenDC3quantile_byG4overlap.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_bigwigs[c(2,3)],bg_bwfiles = c(geo_bigwigs[1],geo_bigwigs[1]), loci = top25.pds.CTCF_G4, mode = "center",verbose = F, colors = mypal[c(2,3)],norm_mode = "log2fc",show_error = T) + coord_cartesian(ylim=c(-1,1))
p2 <- plot_bw_profile(bwfiles = geo_bigwigs[c(2,3)],bg_bwfiles = c(geo_bigwigs[1],geo_bigwigs[1]), loci = top25.pds.CTCF_only, mode = "center",verbose = F, colors = mypal[c(2,3)],norm_mode = "log2fc",show_error = T) + coord_cartesian(ylim=c(-1,1))
ggarrange(p1,p2, ncol=2)
ggsave(glue("{plot_folder}Profile_CTCFfoldchange_top25_PDSquantile_byG4.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_bigwigs[3],bg_bwfiles = geo_bigwigs[1], loci = top25.pdc.CTCF_G4, mode = "center",verbose = F, colors = mypal[3],norm_mode = "log2fc",show_error = T) + coord_cartesian(ylim=c(-1,1))
p2 <- plot_bw_profile(bwfiles = geo_bigwigs[3],bg_bwfiles = geo_bigwigs[1], loci = top25.pdc.CTCF_only, mode = "center",verbose = F, colors = mypal[3],norm_mode = "log2fc",show_error = T) + coord_cartesian(ylim=c(-1,1))
ggarrange(p1,p2, ncol=2)
ggsave(glue("{plot_folder}Profile_CTCFfoldchange_top25_PhenDC3quantile_byG4.pdf"),
plot = last_plot())
#geo_CnR_bigwigs <- list.files("../mendeley/additional/","_G4.bw",full.names = T)
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = top25.pds, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = bot75.pds, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
ggarrange(p1,p2,p3, ncol=3)
ggsave(glue("{plot_folder}Profile_G4atCTCFpeaks_percentiles.pdf"),
plot = last_plot())
closG4 <- bedscout::annotate_nearby_features(G4.motifs,feat_gr = makeGRangesFromDataFrame(results[,c(1,2,3,8)],keep.extra.columns = T),name_field = "name",distance_cutoff = 1000)
closG4 <- closG4[!is.na(closG4$nearby_features),]
p3 <- plot_bw_profile(bwfiles = c('../mendeley/additional/G4.mm10.plus.bw','../mendeley/additional/G4.mm10.minus.bw'), loci = closG4, mode = "center",verbose = F, colors = c("#FFAAFF","#DDBBFF"),show_error = T)
p4 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = closG4, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p5 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = closG4, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
ggarrange(p3,p4,p5,ncol=3)
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[3:4], loci = top25.pds, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[3:4], loci = bot75.pds, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[3:4], loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
ggarrange(p1,p2,p3, ncol=3)
ggsave(glue("{plot_folder}Profile_PhenDC3_G4atCTCFpeaks_PDSpercentiles.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = top25.pds.CTCF_G4, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = top25.pds.CTCF_only, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
ggarrange(p1,p2,p3, ncol=3)
ggsave(glue("{plot_folder}Profile_G4atCTCFpeaks_byG4.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = top25.pds, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = bot75.pds, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
ggarrange(p1,p2,p3, ncol=3)
p4 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[1:2], loci = "../data/peaks/G4H_mm10_1.75.bed", mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p5 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = "../data/peaks/G4H_mm10_1.75.bed", mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
ggarrange(p4,p4,p5, ncol=3)
ggsave(glue("{plot_folder}Profile_G4atG4motifs.pdf"),
plot = last_plot())
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = top25.pds.CTCF_G4, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = top25.pds.CTCF_only, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[2], bg_bwfiles = geo_CnR_bigwigs[1], norm_mode = "log2fc", loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
ggarrange(p1,p2,p3, ncol=3)
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[3:4], loci = top25.pdc.CTCF_G4, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[3:4], loci = top25.pdc.CTCF_only, mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[3:4], loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal,show_error = T) + coord_cartesian(ylim=c(0,15))
ggarrange(p1,p2,p3, ncol=3)
p1 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[4], bg_bwfiles = geo_CnR_bigwigs[3], norm_mode = "log2fc", loci = top25.pdc.CTCF_G4, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
p2 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[4], bg_bwfiles = geo_CnR_bigwigs[3], norm_mode = "log2fc", loci = top25.pdc.CTCF_only, mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
p3 <- plot_bw_profile(bwfiles = geo_CnR_bigwigs[4], bg_bwfiles = geo_CnR_bigwigs[3], norm_mode = "log2fc", loci = "../data/peaks/Control_peaks_shuffled.bed", mode = "center",verbose = F, colors = mypal[2],show_error = T) + coord_cartesian(ylim=c(-2,2))
ggarrange(p1,p2,p3, ncol=3)
df1 <- data.frame(set="top25_CTCF_G4", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[1:2],loci=top25.pds.CTCF_G4, labels=c("Mock","PDS")))[,6:7])
df2 <- data.frame(set="top25_CTCF_only", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[1:2],loci=top25.pds.CTCF_only, labels=c("Mock","PDS")))[,6:7])
df3 <- data.frame(set="bottom75", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[1:2],loci=bot75.pds, labels=c("Mock","PDS")))[,6:7])
df4 <- data.frame(set="Random", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[1:2], loci="../data/peaks/Control_peaks_shuffled.bed", labels=c("Mock","PDS")))[,6:7])
df <- rbind(df1,df2,df3,df4)
df$lfc.pds <- log2(df$PDS/df$Mock)
df$diff.pds <- df$PDS - df$Mock
mdf <- melt(df)
mdf$lg2 <- log2(mdf$value)
ggviolin(mdf[mdf$variable %in% c("Mock","PDS"),], "set","lg2",fill="variable",palette = mypal, add="median_iqr")
ggviolin(mdf[mdf$variable %in% "lfc.pds",], "set","value",fill="variable",palette = mypal, add="median_iqr") + geom_hline(yintercept = 0)
ggviolin(mdf[mdf$variable %in% "diff.pds",], "set","value",fill="variable",palette = mypal, add="median_iqr") + coord_cartesian(ylim = c(-20,20)) + geom_hline(yintercept = 0)
df1 <- data.frame(set="top25_CTCF_G4", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[3:4],loci=top25.pdc.CTCF_G4, labels=c("Mock","PDC")))[,6:7])
df2 <- data.frame(set="top25_CTCF_only", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[3:4],loci=top25.pdc.CTCF_only, labels=c("Mock","PDC")))[,6:7])
df3 <- data.frame(set="bottom75", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[3:4],loci=bot75.pdc, labels=c("Mock","PDC")))[,6:7])
df4 <- data.frame(set="Random", as.data.frame(bw_loci(bwfiles = geo_CnR_bigwigs[3:4], loci="../data/peaks/Control_peaks_shuffled.bed", labels=c("Mock","PDC")))[,6:7])
df <- rbind(df1,df2,df3,df4)
df$lfc.pdc <- log2(df$PDC/df$Mock)
df$diff.pdc <- df$PDC - df$Mock
mdf <- melt(df)
mdf$lg2 <- log2(mdf$value)
ggviolin(mdf[mdf$variable %in% c("Mock","PDC"),], "set","lg2",fill="variable",palette = mypal, add="median_iqr")
ggviolin(mdf[mdf$variable %in% "lfc.pdc",], "set","value",fill="variable",palette = mypal, add="median_iqr") + geom_hline(yintercept = 0)
ggviolin(mdf[mdf$variable %in% "diff.pdc",], "set","value",fill="variable",palette = mypal, add="median_iqr") + coord_cartesian(ylim = c(-20,20)) + geom_hline(yintercept = 0)
top25.pds.CTCF_G4 <- makeGRangesFromDataFrame(results[(results$pds.quantile==4 & results$class == "CTCF_and_G4"),1:3],na.rm=T)
top25.pds.CTCF_only <- makeGRangesFromDataFrame(results[(results$pds.quantile==4 & results$class == "CTCF_not_G4"),1:3],na.rm=T)
p1 <- plot_bw_profile(bwfiles = G4_bigwigs, loci = top25.pds.CTCF_G4, mode = "center",verbose = F, colors = mypal[3]) + coord_cartesian(ylim=c(0,10))
p2 <- plot_bw_profile(bwfiles = G4_bigwigs, loci = top25.pds.CTCF_only, mode = "center",verbose = F, colors = mypal[3]) + coord_cartesian(ylim=c(0,10))
ggarrange(p1,p2, ncol=2)
p1 <- plot_bw_profile(bwfiles = G4_bigwigs, loci = top25.pdc.CTCF_G4, mode = "center",verbose = F, colors = mypal[3]) + coord_cartesian(ylim=c(0,10))
p2 <- plot_bw_profile(bwfiles = G4_bigwigs, loci = top25.pdc.CTCF_only, mode = "center",verbose = F, colors = mypal[3]) + coord_cartesian(ylim=c(0,10))
ggarrange(p1,p2, ncol=2)
ord.top25 <- order(rowMeans(as.data.frame(bw_heatmap(bwfiles = geo_bigwigs[1],loci = top25.pds, mode = "center"))))
p1 <- plot_bw_heatmap(bwfiles = geo_bigwigs[1],loci = top25.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 50, order_by = ord.top25)
p2 <- plot_bw_heatmap(bwfiles = geo_bigwigs[2],loci = top25.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 50, order_by = ord.top25)
ggarrange(p1,p2, ncol=2, common.legend = T)
ggsave(glue("{plot_folder}Heatmap_CTCF_top25_PDSquantile.pdf"),
plot = last_plot())
ord.top25 <- order(rowMeans(as.data.frame(bw_heatmap(bwfiles = geo_bigwigs[3],loci = top25.pds, mode = "center"))))
p1 <- plot_bw_heatmap(bwfiles = geo_bigwigs[1],loci = top25.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 50, order_by = ord.top25)
p2 <- plot_bw_heatmap(bwfiles = geo_bigwigs[3],loci = top25.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 50, order_by = ord.top25)
ggarrange(p1,p2, ncol=2, common.legend = T)
ggsave(glue("{plot_folder}Heatmap_CTCF_top25_PhenDC3_on_PDS_quantile.pdf"),
plot = last_plot())
ord.bot75 <- order(rowMeans(as.data.frame(bw_heatmap(bwfiles = geo_bigwigs[1],loci = bot75.pds, mode = "center"))))
p1 <- plot_bw_heatmap(bwfiles = geo_bigwigs[1],loci = bot75.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 200, order_by = ord.bot75)
p2 <- plot_bw_heatmap(bwfiles = geo_bigwigs[2],loci = bot75.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 200, order_by = ord.bot75)
ggarrange(p1,p2, ncol=2, common.legend = T)
ggsave(glue("{plot_folder}Heatmap_CTCF_bot75_PDSquantile.pdf"),
plot = last_plot())
ord.bot75 <- order(rowMeans(as.data.frame(bw_heatmap(bwfiles = geo_bigwigs[1],loci = bot75.pds, mode = "center"))))
p1 <- plot_bw_heatmap(bwfiles = geo_bigwigs[1],loci = bot75.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 200, order_by = ord.bot75)
p2 <- plot_bw_heatmap(bwfiles = geo_bigwigs[3],loci = bot75.pds, mode = "center",verbose = F, zmax = 10, max_rows_allowed = 200, order_by = ord.bot75)
ggarrange(p1,p2, ncol=2, common.legend = T)
ggsave(glue("{plot_folder}Heatmap_CTCF_bot75_PhenDC3_on_PDS_quantile.pdf"),
plot = last_plot())
G4_CnR <- bw_loci(
c(
"../mendeley/FigureS2/G4_CUT-Run_Mock-PDS_CPM_Wulfridge.bw",
"../mendeley/FigureS2/G4_CUT-Run_PDS_CPM_Wulfridge.bw"
),
loci = makeGRangesFromDataFrame(results, na.rm = T),
labels = c("Mock", "PDS")
)
results$G4_CnR_delta <- G4_CnR$PDS - G4_CnR$Mock
results$G4_CnR_lfc <- log2(G4_CnR$PDS / G4_CnR$Mock)
results$G4_CnR_mock <- G4_CnR$Mock
ggviolin(
results,
x = "pds.quantile",
y = "G4_CnR_delta",
fill = mypal[2],
add = "median_iqr"
) + coord_cartesian(ylim = c(-10, 15)) + geom_hline(yintercept = 1.55, linetype =
"dotted")
ggsave(glue("{plot_folder}Violin_G4_CnR_delta_by_PDSquantile.pdf"),
plot = last_plot())
ggviolin(
results,
x = "pds.quantile",
y = "G4_CnR_lfc",
fill = mypal[2],
add = "median_iqr"
) + coord_cartesian(ylim = c(-10, 15)) + geom_hline(yintercept = 0, linetype =
"dotted")
ggsave(glue("{plot_folder}Violin_G4_CnR_delta_by_PDSquantile.pdf"),
plot = last_plot())
compare_means(G4_CnR_lfc ~ pds.quantile, results)
results$pds.quartile.top25 <- results$pds.quantile == 4
mean(na.omit(results$G4_CnR_delta))
mean(results$G4_CnR_delta[results$pds.quartile.top25])
mean(results$G4_CnR_delta[!results$pds.quartile.top25])
compare_means(G4_CnR_delta ~ pds.quartile.top25, results)
export.bed(top25.pds,"../data/peaks/CTCF_peaks_top25_pds_up.bed")
export.bed(bot75.pds,"../data/peaks/CTCF_peaks_bot75_pds_up.bed")
top25.pds <- rtracklayer::import("../data/peaks/CTCF_peaks_top25_pds_up.bed")
bot75.pds <- rtracklayer::import("../data/peaks/CTCF_peaks_bot75_pds_up.bed")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KCJkYXRhLnRhYmxlIikKbGlicmFyeSgicnRyYWNrbGF5ZXIiKQpsaWJyYXJ5KCJnZ3Jhc3RyIikKbGlicmFyeSgiZ2x1ZSIpCmxpYnJhcnkoIkRFU2VxMiIpCmxpYnJhcnkoImdncHViciIpCmxpYnJhcnkoIndpZ2dsZXNjb3V0IikKbGlicmFyeSgiZXVsZXJyIikKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoImNvcnJwbG90IikKbGlicmFyeSgiYmVkc2NvdXQiKQoKIyBleHBvcnQgCnJlc3VsdF9mb2xkZXIgPSAiLi4vcmVzdWx0cy8iCnBsb3RfZm9sZGVyID0gIi4uL3Jlc3VsdHMvcGxvdHMvIgpzdGF0X291dHB1dCA9ICIuLi9yZXN1bHRzL3N0YXRzLyIKCmNvbWJpbmVkX2JpZ3dpZ3MgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9tZW5kZWxleS9GaWd1cmUyIiwgcGF0dGVybiA9ICIqX0NUQ0YqLmJ3IiwKICAgICAgICAgICAgICAgICAgZnVsbC5uYW1lcyA9IFRSVUUpCmdlb19iaWd3aWdzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvbWVuZGVsZXkvRmlndXJlMiIscGF0dGVybiA9IipfQ1RDRi5idyIsCiAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKQpnZW9fQ25SX2JpZ3dpZ3MgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9tZW5kZWxleS9GaWd1cmVTMiIsIHBhdHRlcm4gPSAiKld1bGZyaWRnZS5idyIsCiAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKQpgYGAKCmBgYHtyfQojIGNvbG9ycwpteXBhbCA8LWMoImNvcm5mbG93ZXJibHVlIiwib3JhbmdlIiwicmVkMiIsImRhcmtncmVlbiIsIiM1MDUwNTAiKQpteXBhbCA8LWMoIiMwMDYxOUQiLCIjQTgyQTM0Iiwib3JhbmdlIiwic2VhZ3JlZW4iLCIjNTA1MDUwIikKbXlwYWwyIDwtYygiIzAwNjE5RCIsIiM3RkIwQ0UiLCIjQTgyQTM0IiwiI0QzOTQ5OSIsIm9yYW5nZSIsIiNGRkQ1NUEiLCJzZWFncmVlbiIsIiM3REJBOUMiLCIjNTA1MDUwIikKYGBgCgpgYGB7cn0KIyBkaWZmIHNpZ25hbCBmdW5jdGlvbgpid19ncmFuZ2VzX2RpZmZfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZ3Jhbmdlc19jMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5nZXNfYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9jMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX2MyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVfc2l6ZV9mYWN0b3JzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19ncmFuZ2VzID0gRkFMU0UpIHsKICAjIEJpbmQgZmlyc3QsIGdldCBudW1iZXJzIGFmdGVyCiAgbmFtZXNfdmFsdWVzIDwtIE5VTEwKICBmaWVsZHMgPC0gbmFtZXMobWNvbHMoZ3Jhbmdlc19jMSkpCiAgCiAgaWYgKCJuYW1lIiAlaW4lIGZpZWxkcykgewogICAgbmFtZXNfdmFsdWVzIDwtIG1jb2xzKGdyYW5nZXNfYzEpW1sibmFtZSJdXQogICAgZ3Jhbmdlc19jMSA8LSBncmFuZ2VzX2MxWywgZmllbGRzW2ZpZWxkcyAhPSAibmFtZSJdXQogIH0KICAKICBmaWVsZHMgPC0gbmFtZXMobWNvbHMoZ3Jhbmdlc19jMikpCiAgaWYgKCJuYW1lIiAlaW4lIGZpZWxkcykgewogICAgZ3Jhbmdlc19jMiA8LSBncmFuZ2VzX2MyWywgZmllbGRzW2ZpZWxkcyAhPSAibmFtZSJdXQogIH0KICAKICBjdHNfZGYgPC0gY2JpbmQoZGF0YS5mcmFtZShncmFuZ2VzX2MxKSwgbWNvbHMoZ3Jhbmdlc19jMikpCiAgCiAgaWYgKCFpcy5udWxsKG5hbWVzX3ZhbHVlcykpIHsKICAgIHJvd25hbWVzKGN0c19kZikgPC0gbmFtZXNfdmFsdWVzCiAgfQogIAogICMgTmVlZHMgdG8gZHJvcCBub24tY29tcGxldGUgY2FzZXMgYW5kIG1hdGNoIHJvd3MKICBjb21wbGV0ZSA8LSBjb21wbGV0ZS5jYXNlcyhjdHNfZGYpCiAgY3RzX2RmIDwtIGN0c19kZltjb21wbGV0ZSwgXQogIAogIHZhbHVlc19kZiA8LSBjdHNfZGZbLCA2Om5jb2woY3RzX2RmKV0gJT4lIGRwbHlyOjpzZWxlY3Qod2hlcmUoaXMubnVtZXJpYykpCiAgY3RzIDwtIGdldF9ucmVhZHNfY29sdW1ucyh2YWx1ZXNfZGYpCiAgCiAgY29uZGl0aW9uX2xhYmVscyA8LSBjKHJlcChsYWJlbF9jMSwgbGVuZ3RoKG1jb2xzKGdyYW5nZXNfYzEpKSksIHJlcChsYWJlbF9jMiwgbGVuZ3RoKG1jb2xzKGdyYW5nZXNfYzIpKSkpCiAgCiAgCiAgY29sZGF0YSA8LSBkYXRhLmZyYW1lKGNvbG5hbWVzKGN0cyksIGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb25fbGFiZWxzKSkKICBwcmludChjb2xkYXRhKQogIAogIGRkcyA8LSBERVNlcTI6OkRFU2VxRGF0YVNldEZyb21NYXRyaXgoCiAgICBjb3VudERhdGEgPSBjdHMsCiAgICBjb2xEYXRhID0gY29sZGF0YSwKICAgIGRlc2lnbiA9IH4gY29uZGl0aW9uLAogICAgcm93UmFuZ2VzID0gZ3Jhbmdlc19jMVtjb21wbGV0ZSwgXQogICkKICAKICAKICBpZiAoZXN0aW1hdGVfc2l6ZV9mYWN0b3JzID09IFRSVUUpIHsKICAgIGRkcyA8LSBERVNlcTI6OmVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzKQogIH0KICBlbHNlIHsKICAgICMgU2luY2UgZmlsZXMgYXJlIHNjYWxlZCwgd2UgZG8gbm90IHdhbnQgdG8gZXN0aW1hdGUgc2l6ZSBmYWN0b3JzCiAgICBzaXplRmFjdG9ycyhkZHMpIDwtIGMocmVwKDEsIG5jb2woY3RzKSkpCiAgfQogIAogIGRkcyA8LSBERVNlcTI6OmVzdGltYXRlRGlzcGVyc2lvbnMoZGRzKQogIGRkcyA8LSBERVNlcTI6Om5iaW5vbVdhbGRUZXN0KGRkcykKICAKICBpZiAoYXNfZ3JhbmdlcykgewogICAgcmVzdWx0IDwtIERFU2VxMjo6cmVzdWx0cyhkZHMsIGZvcm1hdCA9ICJHUmFuZ2VzIiwgYWxwaGEgPSAwLjAxKQogICAgaWYgKCFpcy5udWxsKG5hbWVzX3ZhbHVlcykpIHsKICAgICAgcmVzdWx0JG5hbWUgPC0gbmFtZXNfdmFsdWVzW2NvbXBsZXRlXQogICAgfQogICAgCiAgfQogIGVsc2UgewogICAgIyByZXN1bHQgPC0gcmVzdWx0cyhkZHMsIGZvcm1hdD0iRGF0YUZyYW1lIikKICAgIHJlc3VsdCA8LSBkZHMKICB9CiAgCiAgcmVzdWx0Cn0KCmdldF9ucmVhZHNfY29sdW1ucyA8LSBmdW5jdGlvbihkZiwgbGVuZ3RoX2ZhY3RvciA9IDEwMCkgewogICMgQ29udmVydCBtZWFuIGNvdmVyYWdlcyB0byByb3VuZCBpbnRlZ2VyIHJlYWQgbnVtYmVycwogIGN0cyA8LSBhcy5tYXRyaXgoZGYpCiAgY3RzIDwtIGFzLm1hdHJpeChjdHNbY29tcGxldGUuY2FzZXMoY3RzKSwgXSkKICBjdHMgPC0gcm91bmQoY3RzICogbGVuZ3RoX2ZhY3RvcikKICBjdHMKfQpgYGAKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTV9CmN0Y2YucmF3IDwtIGltcG9ydCgiLi4vZGF0YS9wZWFrcy9DVENGX21FU19wZWFrcy5uYXJyb3dQZWFrIikKRzQucmF3IDwtIGltcG9ydCgiLi4vZGF0YS9wZWFrcy9HNF9XVF9wZWFrcy5uYXJyb3dQZWFrIikKY3RjZi5yYXckY2xhc3MgPC0gIkNUQ0Zfbm90X0c0IgpHNC5yYXckY2xhc3MgPC0gIkc0IgpjdGNmLnJhdyRwcm8gPC0gIk5BIgpHNC5yYXckcHJvIDwtICJOQSIKdHIucHJvIDwtIHJ0cmFja2xheWVyOjppbXBvcnQoIi4uL2RhdGEvcGVha3MvcmVnaW9ucy9wcm9tb3RlcnNfZ2VuZVN5bWJvbC5tbTEwLmJlZCIpCnRyLmJsYWNrbGlzdCA8LSBydHJhY2tsYXllcjo6aW1wb3J0KCIuLi9kYXRhL3BlYWtzL3JlZ2lvbnMvbW0xMC1ibGFja2xpc3QudjIuYmVkIikKCmN0Y2YuYW5ubyA8LSBiZWRzY291dDo6YW5ub3RhdGVfb3ZlcmxhcHBpbmdfZmVhdHVyZXMoY3RjZi5yYXcsdHIuYmxhY2tsaXN0LG5hbWVfZmllbGQgPSAibmFtZSIpCmN0Y2YuYW5ubyA8LSBjdGNmLmFubm9baXMubmEoY3RjZi5hbm5vJG5lYXJieV9mZWF0dXJlcyldCgpjdGNmLmFubm8gPC0gYmVkc2NvdXQ6OmFubm90YXRlX292ZXJsYXBwaW5nX2ZlYXR1cmVzKGN0Y2YuYW5ubyx0ci5wcm8sbmFtZV9maWVsZCA9ICJuYW1lIikKY3RjZi5hbm5vJHByb1tpcy5uYShjdGNmLmFubm8kbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIm5vUHJvIgpjdGNmLmFubm8kcHJvWyFpcy5uYShjdGNmLmFubm8kbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIlBybyIKCmN0Y2YuYW5ubyA8LSBiZWRzY291dDo6YW5ub3RhdGVfb3ZlcmxhcHBpbmdfZmVhdHVyZXMoY3RjZi5hbm5vLEc0LnJhdyxuYW1lX2ZpZWxkID0gImNsYXNzIikKY3RjZi5hbm5vJGNsYXNzWyFpcy5uYShjdGNmLmFubm8kbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIkNUQ0ZfYW5kX0c0IgpjdGNmLmFubm8kbmFtZSA8LSBwYXN0ZTAoY3RjZi5hbm5vJGNsYXNzLCIgIixjdGNmLmFubm8kcHJvKQoKCgpjdGNmLmFubm8gPC0gc29ydFNlcWxldmVscyhjdGNmLmFubm8pCmN0Y2YuYW5ubyA8LSBzb3J0KGN0Y2YuYW5ubykKcGVha3NfYmVkIDwtICIuLi9kYXRhL3BlYWtzL0NUQ0ZfRzRfaW5fNl9jYXRlZ29yaWVzLmJlZCIKZXhwb3J0LmJlZChjdGNmLmFubm8sIHBlYWtzX2JlZCkKYGBgCgpgYGB7cn0KY3RjZi5hbmQuRzQucHJvIDwtIGltcG9ydCgiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiKQpjdGNmLm5vdC5HNC5wcm8gPC0gaW1wb3J0KCIuLi9kYXRhL3BlYWtzL0NUQ0Ytb25seV93aXRoX3Byb21vdGVyc19zb3J0ZWQuYmVkIikKY3RjZi5hbmQuRzQubnByIDwtIGltcG9ydCgiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhvdXRfcHJvbW90ZXJzX3NvcnRlZC5iZWQiKQpjdGNmLm5vdC5HNC5ucHIgPC0gaW1wb3J0KCIuLi9kYXRhL3BlYWtzL0NUQ0Ytb25seV93aXRob3V0X3Byb21vdGVyc19zb3J0ZWQuYmVkIikKCmN0Y2YuYW5kLkc0LnBybyRjbGFzcyA8LSAiQ1RDRl9hbmRfRzQiCmN0Y2Yubm90Lkc0LnBybyRjbGFzcyA8LSAiQ1RDRl9ub3RfRzQiCmN0Y2YuYW5kLkc0Lm5wciRjbGFzcyA8LSAiQ1RDRl9hbmRfRzQiCmN0Y2Yubm90Lkc0Lm5wciRjbGFzcyA8LSAiQ1RDRl9ub3RfRzQiCmN0Y2YuYW5kLkc0LnBybyRwcm8gPC0gIlBybyIKY3RjZi5ub3QuRzQucHJvJHBybyA8LSAiUHJvIgpjdGNmLmFuZC5HNC5ucHIkcHJvIDwtICJub1BybyIKY3RjZi5ub3QuRzQubnByJHBybyA8LSAibm9Qcm8iCgpjdGNmLmFuZC5HNCA8LSBjKGN0Y2YuYW5kLkc0LnBybyxjdGNmLmFuZC5HNC5ucHIpCmN0Y2Yubm90Lkc0IDwtIGMoY3RjZi5ub3QuRzQucHJvLGN0Y2Yubm90Lkc0Lm5wcikKY3RjZi5tZXJnZWQgPC0gYyhjdGNmLmFuZC5HNCxjdGNmLm5vdC5HNCkKY3RjZi5tZXJnZWQgIDwtIHNvcnRTZXFsZXZlbHMoY3RjZi5tZXJnZWQgKQpjdGNmLm1lcmdlZCAgPC0gc29ydChjdGNmLm1lcmdlZCkKbmFtZXMoY3RjZi5tZXJnZWQgKSA8LSBwYXN0ZTAoY3RjZi5tZXJnZWQgJGNsYXNzLCIgIixjdGNmLm1lcmdlZCAkcHJvKQpleHBvcnQuYmVkKGN0Y2YubWVyZ2VkICwgIi4uL2RhdGEvcGVha3MvQ1RDRl9HNF9pbl82X2NhdGVnb3JpZXNfbWVyZ2VkLmJlZCIpCmBgYAoKYGBge3J9CmN0Y2YgPC0gY3RjZi5hbm5vCnRhYmxlKGN0Y2YubWVyZ2VkJGNsYXNzLGN0Y2YubWVyZ2VkJHBybykKdGFibGUoY3RjZi5hbm5vJGNsYXNzLGN0Y2YuYW5ubyRwcm8pCmBgYAoKYGBge3J9CmdnZGVuc2l0eShhcy5kYXRhLmZyYW1lKGN0Y2YuYW5ubyxyb3cubmFtZXMgPSBOVUxMKSx4PSJ3aWR0aCIseSA9ICJkZW5zaXR5Iixjb2xvciA9ICJjbGFzcyIsIGZpbGw9ImNsYXNzIiwgYWxwaGE9MC4xLCBwYWxldHRlPW15cGFsKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEwMCw4MDApKQpnZ2RlbnNpdHkoYXMuZGF0YS5mcmFtZShjdGNmLm1lcmdlZCxyb3cubmFtZXMgPSBOVUxMKSx4PSJ3aWR0aCIseSA9ICJkZW5zaXR5Iixjb2xvciA9ICJjbGFzcyIsIGZpbGw9ImNsYXNzIiwgYWxwaGE9MC4xLCBwYWxldHRlPW15cGFsKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEwMCw4MDApKQpgYGAKCmBgYHtyfQpkZiA8LSByYmluZChkYXRhLmZyYW1lKGN0Y2YuYW5ub1ssMDowXSxwZWFrd2lkdGg9Im9yaWdpbmFsIiwgcm93Lm5hbWVzID0gTlVMTCksIGRhdGEuZnJhbWUoY3RjZi5tZXJnZWRbLDA6MF0scGVha3dpZHRoPSJtZXJnZWQiLCByb3cubmFtZXMgPSBOVUxMKSkKZ2dkZW5zaXR5KGRmLHg9IndpZHRoIix5ID0gImRlbnNpdHkiLGNvbG9yID0gInBlYWt3aWR0aCIsIGZpbGw9InBlYWt3aWR0aCIsIGFscGhhPTAuMSwgcGFsZXR0ZT1teXBhbCkgKyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxMDAsODAwKSkgKyBnZ3RpdGxlKCJQZWFrd2lkdGggYWxsIHBlYWtzIikKYGBgCgpgYGB7cn0KZGYgPC0gcmJpbmQoZGF0YS5mcmFtZShjdGNmLmFubm9bY3RjZi5hbm5vJGNsYXNzPT0iQ1RDRl9hbmRfRzQiLDA6MF0scGVha3dpZHRoPSJvcmlnaW5hbCIsIHJvdy5uYW1lcyA9IE5VTEwpLCBkYXRhLmZyYW1lKGN0Y2YubWVyZ2VkW2N0Y2YubWVyZ2VkJGNsYXNzPT0iQ1RDRl9hbmRfRzQiLDA6MF0scGVha3dpZHRoPSJtZXJnZWQiLCByb3cubmFtZXMgPSBOVUxMKSkKZ2dkZW5zaXR5KGRmLHg9IndpZHRoIix5ID0gImRlbnNpdHkiLGNvbG9yID0gInBlYWt3aWR0aCIsIGZpbGw9InBlYWt3aWR0aCIsIGFscGhhPTAuMSwgcGFsZXR0ZT1teXBhbCkgKyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxMDAsODAwKSkgKyBnZ3RpdGxlKCJQZWFrd2lkdGggQ1RDRl9hbmRfRzQgcGVha3MiKQpgYGAKCiMjIyBjYWxjdWxhdGUgY292ZXJhZ2Ugb3ZlciBwZWFrcwpgYGB7cn0KIyBXdWxmcmlkZ2UgQ1RDRiBDaElQLVNlcSBtb2Nrcwptb2Nrc19iaWd3aWdzID0gYygiLi4vbWVuZGVsZXkvRmlndXJlUzMvR1NNNzExNjI3N19FMTRfTW9ja19DVENGX1JlcDEuc25ha2VtYWtlLmJ3IiwKICAgICAgICAgICIuLi9tZW5kZWxleS9GaWd1cmVTMy9HU003MTE2Mjc4X0UxNF9Nb2NrX0NUQ0ZfUmVwMi5zbmFrZW1ha2UuYnciKQoKIyBQRFMKIyBXdWxmcmlkZ2UgQ1RDRiBDaElQLVNlcQpwZHNfYmlnd2lncyA9IGMoIi4uL21lbmRlbGV5L0ZpZ3VyZVMzL0dTTTcxMTYyNzlfRTE0X1BEU19DVENGX1JlcDEuc25ha2VtYWtlLmJ3IiwKICAgICAgICAgICAgICAgICIuLi9tZW5kZWxleS9GaWd1cmVTMy9HU003MTE2MjgwX0UxNF9QRFNfQ1RDRl9SZXAyLnNuYWtlbWFrZS5idyIpCgpwZGNfYmlnd2lncyA9IGMoIi4uL21lbmRlbGV5L0ZpZ3VyZVMzL0dTTTcxMTYyODFfRTE0X1BoZW5EQzNfQ1RDRl9SZXAxLnNuYWtlbWFrZS5idyIsCiAgICAgICAgICAgICAgICAiLi4vbWVuZGVsZXkvRmlndXJlUzMvR1NNNzExNjI4Ml9FMTRfUGhlbkRDM19DVENGX1JlcDIuc25ha2VtYWtlLmJ3IikKCkc0X2JpZ3dpZ3MgPSBjKCIuLi9tZW5kZWxleS9GaWd1cmUxL0c0X0NVVC1UYWdfdGhpc1N0dWR5LmJ3IikKCmNvdi5tb2NrcyA8LSBid19sb2NpKG1vY2tzX2JpZ3dpZ3MscGVha3NfYmVkLGxhYmVscz1jKCJtb2NrXzEiLCJtb2NrXzIiKSkKY292LnBkcyA8LSBid19sb2NpKHBkc19iaWd3aWdzLHBlYWtzX2JlZCxsYWJlbHM9YygiUERTXzEiLCJQRFNfMiIpKQpjb3YucGRjIDwtIGJ3X2xvY2kocGRjX2JpZ3dpZ3MscGVha3NfYmVkLGxhYmVscz1jKCJQaGVuREMzXzEiLCJQaGVuREMzXzIiKSkKY292Lkc0IDwtIGJ3X2xvY2koRzRfYmlnd2lncyxwZWFrc19iZWQsbGFiZWxzPWMoIkc0X05UIikpCmNvdi5jb21iaW5lZCA8LSBid19sb2NpKGNvbWJpbmVkX2JpZ3dpZ3MscGVha3NfYmVkLGxhYmVscz1jKCJtb2NrIiwiUERTIiwiUGhlbkRDMyIpKQpjb3YuZ2VvIDwtIGJ3X2xvY2koZ2VvX2JpZ3dpZ3MscGVha3NfYmVkLGxhYmVscz1jKCJHRU9fbW9jayIsIkdFT19QRFMiLCJHRU9fUGhlbkRDMyIpKQpgYGAKCiMjIyBxdWljayBjb21wYXJpc29uIG9uIGRlcG9zaXRlZCBhbmQgcmVwcm9jZXNzZWQgYmlnd2lnIGZpbGVzCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KY29ycl9kZiA8LSBkYXRhLmZyYW1lKGRhdGEuZnJhbWUoY292LmNvbWJpbmVkKVssYyg5LDYsNyw4KV0sZGF0YS5mcmFtZShjb3YuZ2VvKVssNjo4XSxkYXRhLmZyYW1lKGNvdi5tb2NrcylbLDY6N10sZGF0YS5mcmFtZShjb3YucGRzKVssNjo3XSxkYXRhLmZyYW1lKGNvdi5wZGMpWyw2OjddKQpyZXMgPC0gY29yKGNvcnJfZGZbLDI6MTNdKQpjb3JycGxvdChyZXMsIHR5cGUgPSAidXBwZXIiLCBvcmRlciA9ICJoY2x1c3QiLHRsLmNvbCA9ICJibGFjayIsIHRsLnNydCA9IDQ1LGFkZENvZWYuY29sID0gJ2JsYWNrJyx0bC5wb3MgPSAnZCcsICAgIGNsLnBvcyA9ICduJywgY29sLmxpbT1jKDAuOTMsIDEpLGlzLmNvcnIgPSBGLCBtZXRob2QgPSAnY29sb3InKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTl9CnAxIDwtIHBsb3RfYndfcHJvZmlsZShjKG1vY2tzX2JpZ3dpZ3NbMV0scGRzX2JpZ3dpZ3NbMV0scGRjX2JpZ3dpZ3NbMV0pLGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMi40KSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGMobW9ja3NfYmlnd2lnc1syXSxwZHNfYmlnd2lnc1syXSxwZGNfYmlnd2lnc1syXSksbG9jaSA9ICIuLi9kYXRhL3BlYWtzL0c0X0NUQ0Zfd2l0aF9wcm9tb3RlcnNfc29ydGVkLmJlZCIsbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwyLjQpKQpwMyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGNvbWJpbmVkX2JpZ3dpZ3MsbG9jaSA9ICIuLi9kYXRhL3BlYWtzL0c0X0NUQ0Zfd2l0aF9wcm9tb3RlcnNfc29ydGVkLmJlZCIsbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwyLjQpKQpnZ2FycmFuZ2UocDEscDIscDMsIG5jb2w9MykKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD02fQpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsNSkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gY29tYmluZWRfYmlnd2lncyxsb2NpID0gIi4uL2RhdGEvcGVha3MvRzRfQ1RDRl93aXRoX3Byb21vdGVyc19zb3J0ZWQuYmVkIixtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDIuNikpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpgYGAKYGBge3IgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9Nn0KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lncyxsb2NpID0gIi4uL2RhdGEvcGVha3MvQ1RDRi1vbmx5X3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsNSkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gY29tYmluZWRfYmlnd2lncyxsb2NpID0gIi4uL2RhdGEvcGVha3MvQ1RDRi1vbmx5X3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMi42KSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmBgYApgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD05fQpwMSA8LSBwbG90X2J3X2xvY2lfc2NhdHRlcihtb2Nrc19iaWd3aWdzWzFdLG1vY2tzX2JpZ3dpZ3NbMl0sIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLCB2ZXJib3NlID0gRikKcDIgPC0gcGxvdF9id19sb2NpX3NjYXR0ZXIocGRzX2JpZ3dpZ3NbMV0scGRzX2JpZ3dpZ3NbMl0sIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLCB2ZXJib3NlID0gRikKcDMgPC0gcGxvdF9id19sb2NpX3NjYXR0ZXIocGRjX2JpZ3dpZ3NbMV0scGRjX2JpZ3dpZ3NbMl0sIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLCB2ZXJib3NlID0gRikKZ2dhcnJhbmdlKHAxLHAyLHAzLCBuY29sPTMpCmBgYAoKYGBge3IgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9OX0KcDEgPC0gcGxvdF9id19sb2NpX3NjYXR0ZXIoY29tYmluZWRfYmlnd2lnc1sxXSxjb21iaW5lZF9iaWd3aWdzWzJdLCBsb2NpID0gIi4uL2RhdGEvcGVha3MvRzRfQ1RDRl93aXRoX3Byb21vdGVyc19zb3J0ZWQuYmVkIiwgdmVyYm9zZSA9IEYpCnAyIDwtIHBsb3RfYndfbG9jaV9zY2F0dGVyKGNvbWJpbmVkX2JpZ3dpZ3NbMl0sY29tYmluZWRfYmlnd2lnc1szXSwgbG9jaSA9ICIuLi9kYXRhL3BlYWtzL0c0X0NUQ0Zfd2l0aF9wcm9tb3RlcnNfc29ydGVkLmJlZCIsIHZlcmJvc2UgPSBGKQpwMyA8LSBwbG90X2J3X2xvY2lfc2NhdHRlcihjb21iaW5lZF9iaWd3aWdzWzFdLGNvbWJpbmVkX2JpZ3dpZ3NbM10sIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNF9DVENGX3dpdGhfcHJvbW90ZXJzX3NvcnRlZC5iZWQiLCB2ZXJib3NlID0gRikKZ2dhcnJhbmdlKHAxLHAyLHAzLCBuY29sPTMpCmBgYAoKCmBgYHtyfQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoCiAgYXMuZGF0YS5mcmFtZShjb3YubW9ja3MpLAogIGFzLmRhdGEuZnJhbWUoY292LnBkcylbNjo3XSwKICBhcy5kYXRhLmZyYW1lKGNvdi5wZGMpWzY6N10sCiAgYXMuZGF0YS5mcmFtZShjb3YuRzQpWzZdLAogIHJhdy5sZmMucGRzXzEgPSBsb2cyKGNvdi5wZHMkUERTXzEgLyBjb3YubW9ja3MkbW9ja18xKSwKICByYXcubGZjLnBkc18yID0gbG9nMihjb3YucGRzJFBEU18yIC8gY292Lm1vY2tzJG1vY2tfMiksCiAgcmF3LmxmYy5wZGNfMSA9IGxvZzIoY292LnBkcyRQRFNfMSAvIGNvdi5tb2NrcyRtb2NrXzEpLAogIHJhdy5sZmMucGRjXzIgPSBsb2cyKGNvdi5wZGMkUGhlbkRDM18yIC8gY292Lm1vY2tzJG1vY2tfMiksCiAgcmF3LmxmYy5wZHMgPSBsb2cyKHJvd01lYW5zKGFzLmRhdGEuZnJhbWUoY292LnBkcylbNjo3XSkgLyByb3dNZWFucyhhcy5kYXRhLmZyYW1lKGNvdi5tb2NrcylbNjo3XSkpLAogIHJhdy5sZmMucGRjID0gbG9nMihyb3dNZWFucyhhcy5kYXRhLmZyYW1lKGNvdi5wZGMpWzY6N10pIC8gcm93TWVhbnMoYXMuZGF0YS5mcmFtZShjb3YubW9ja3MpWzY6N10pKSwKICBtZWFuLm1vY2sgPSByb3dNZWFucyhhcy5kYXRhLmZyYW1lKGNvdi5tb2NrcylbNjo3XSksCiAgbWVhbi5wZHMgPSByb3dNZWFucyhhcy5kYXRhLmZyYW1lKGNvdi5wZHMpWzY6N10pLAogIG1lYW4ucGRjID0gcm93TWVhbnMoYXMuZGF0YS5mcmFtZShjb3YucGRjKVs2OjddKQopCgpjb3YubW9ja3MkbmFtZSA8LSBOVUxMCmNvdi5wZHMkbmFtZSA8LSBOVUxMCmNvdi5wZGMkbmFtZSA8LSBOVUxMCgpkZV9wZHMgPC0gYndfZ3Jhbmdlc19kaWZmX2FuYWx5c2lzKGNvdi5tb2NrcywgY292LnBkcywgIk1vY2siLCAiUERTIikKbGZjX3BkcyA9IERFU2VxMjo6bGZjU2hyaW5rKGRlX3BkcywgY29lZiA9ICJjb25kaXRpb25fUERTX3ZzX01vY2siLCB0eXBlID0gImFwZWdsbSIpCgpkZV9wZGMgPC0gYndfZ3Jhbmdlc19kaWZmX2FuYWx5c2lzKGNvdi5tb2NrcywgY292LnBkYywgIk1vY2siLCAiUGhlbkRDMyIpCmxmY19wZGMgPSBERVNlcTI6OmxmY1NocmluayhkZV9wZGMsIGNvZWYgPSAiY29uZGl0aW9uX1BoZW5EQzNfdnNfTW9jayIsIHR5cGUgPSAiYXBlZ2xtIikKCnJlc3VsdHMkZGVzZXEubGZjLnBkcyA8LSByZXN1bHRzKGRlX3BkcykkbG9nMkZvbGRDaGFuZ2UKcmVzdWx0cyRkZXNlcS5sZmNzLnBkcyA8LSBsZmNfcGRzJGxvZzJGb2xkQ2hhbmdlCnJlc3VsdHMkZGVzZXEucGFkai5wZHMgPC0gbGZjX3BkcyRwYWRqCnJlc3VsdHMkZGVzZXEubWVhbi5wZHMgPC0gbG9nMihsZmNfcGRzJGJhc2VNZWFuKQpyZXN1bHRzJGRlc2VxLnNpZy5wZHMgPC0gbGZjX3BkcyRwdmFsdWUgPCAwLjA1CgpyZXN1bHRzJGRlc2VxLmxmYy5wZGMgPC0gcmVzdWx0cyhkZV9wZGMpJGxvZzJGb2xkQ2hhbmdlCnJlc3VsdHMkZGVzZXEubGZjcy5wZGMgPC0gbGZjX3BkYyRsb2cyRm9sZENoYW5nZQpyZXN1bHRzJGRlc2VxLnBhZGoucGRjIDwtIGxmY19wZGMkcGFkagpyZXN1bHRzJGRlc2VxLm1lYW4ucGRjIDwtIGxvZzIobGZjX3BkYyRiYXNlTWVhbikKcmVzdWx0cyRkZXNlcS5zaWcucGRjIDwtIGxmY19wZGMkcHZhbHVlIDwgMC4wNQoKcmVzdWx0cyRjbGFzcyA8LSBnc3ViKCIgLisiLCAiIiwgcmVzdWx0cyRuYW1lKQpyZXN1bHRzJHBybyA8LSBnc3ViKCIuKyAiLCAiIiwgcmVzdWx0cyRuYW1lKQpyZXN1bHRzJHBybyA8LSBmYWN0b3IocmVzdWx0cyRwcm8sIGxldmVscyA9IGMoIlBybyIsICJub1BybyIpKQpyZXN1bHRzJGNsYXNzIDwtIGZhY3RvcihyZXN1bHRzJGNsYXNzLCBsZXZlbHMgPSBjKCJDVENGX2FuZF9HNCIsICJDVENGX25vdF9HNCIpKQoKcmVzdWx0cyRsb2cyLm1vY2sgPC0gbG9nMihyZXN1bHRzJG1lYW4ubW9jaykKcmVzdWx0cyRsb2cyLnBkcyA8LSBsb2cyKHJlc3VsdHMkbWVhbi5wZHMpCnJlc3VsdHMkbG9nMi5wZGMgPC0gbG9nMihyZXN1bHRzJG1lYW4ucGRjKQpyZXN1bHRzJGxvZzIuRzQgPC0gbG9nMihyZXN1bHRzJEc0X05UKQoKcmVzdWx0cyRkZXNlcS5zaWd1cC5wZHMgPC0gcmVzdWx0cyRkZXNlcS5zaWcucGRzICYKICByZXN1bHRzJGRlc2VxLmxmYy5wZHMgPiAwCnJlc3VsdHMkZGVzZXEuc2lndXAucGRjIDwtIHJlc3VsdHMkZGVzZXEuc2lnLnBkYyAmCiAgcmVzdWx0cyRkZXNlcS5sZmMucGRjID4gMApgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShyZXN1bHRzLCBnbHVlKCJ7cmVzdWx0X2ZvbGRlcn1mb2xkY2hhbmdlX3Jlc3VsdHMudHh0IikpCnRhYmxlKHJlc3VsdHMkbmFtZSkKYGBgCgpgYGB7cn0KI3Jlc3VsdHMgPC0gcmVhZC50YWJsZSgiZm9sZGNoYW5nZV9yZXN1bHRzLnR4dCIpCnJlc3VsdHMkY2xhc3MgPC0gZmFjdG9yKHJlc3VsdHMkY2xhc3MsIGxldmVscyA9IGMoIkNUQ0ZfYW5kX0c0IiwgIkNUQ0Zfbm90X0c0IikpCmBgYAoKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CnAgPC0gZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gImNsYXNzIiwKICB5ID0gIm1lYW4ubW9jayIsCiAgZmlsbCA9ICJjbGFzcyIsCiAgcGFsZXR0ZSA9IG15cGFsLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwKSkKYW5ub3RhdGVfZmlndXJlKHAsIGZpZy5sYWIgPSAiQ1RDRiBzaWduYWwgYnkgY2xhc3MgaW4gbW9jayBjb25kaXRpb24sIG1lYW4gb2YgdHdvIHJlcHMsIG1lZGlhbitpcXIiLCBmaWcubGFiLnNpemUgPSA2KQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX2NsYXNzZXMucGRmIiksIGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CnAgPC0gZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gImNsYXNzIiwKICB5ID0gIm1lYW4ubW9jayIsCiAgZmlsbCA9ICJwcm8iLAogIHBhbGV0dGUgPSBteXBhbCwKICBhZGQgPSAibWVkaWFuX2lxciIKKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMCkpCmFubm90YXRlX2ZpZ3VyZShwLCBmaWcubGFiID0gIkNUQ0Ygc2lnbmFsIGJ5IGNsYXNzIGluIG1vY2sgY29uZGl0aW9uLCBtZWFuIG9mIHR3byByZXBzLCBtZWRpYW4raXFyIiwgZmlnLmxhYi5zaXplID0gNikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9jbGFzc2VzX3Byby5wZGYiKSwKICAgICAgIGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTN9Cm1kZiA8LSByZXNoYXBlMjo6bWVsdChkcGx5cjo6c2VsZWN0KAogIHJlc3VsdHMsCiAgYygKICAgICJjbGFzcyIsCiAgICAibW9ja18xIiwKICAgICJtb2NrXzIiLAogICAgIlBEU18xIiwKICAgICJQRFNfMiIsCiAgICAiUGhlbkRDM18xIiwKICAgICJQaGVuREMzXzIiCiAgKQopKQpnZ2JveHBsb3QoCiAgbWRmLAogIHggPSAidmFyaWFibGUiLAogIHkgPSAidmFsdWUiLAogIGZpbGwgPSAiY2xhc3MiLAogIHBhbGV0dGUgPSBteXBhbAopICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwKSkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1Cb3hwbG90X0NUQ0ZfcmVwcy5wZGYiKSwgbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9M30KbWRmIDwtIHJlc2hhcGUyOjptZWx0KGRwbHlyOjpzZWxlY3QoCiAgcmVzdWx0cywKICBjKAogICAgImNsYXNzIiwKICAgICJtb2NrXzEiLAogICAgIm1vY2tfMiIsCiAgICAiUERTXzEiLAogICAgIlBEU18yIiwKICAgICJQaGVuREMzXzEiLAogICAgIlBoZW5EQzNfMiIKICApCikpCgptZGZfc3RhdHNfY2xhc3MgPSBjb21wYXJlX21lYW5zKHZhbHVlIH4gY2xhc3MsIGdyb3VwLmJ5ID0gInZhcmlhYmxlIiwgZGF0YSA9IG1kZikKCmdndmlvbGluKAogIG1kZiwKICB4ID0gInZhcmlhYmxlIiwKICB5ID0gInZhbHVlIiwKICBmaWxsID0gImNsYXNzIiwKICBwYWxldHRlID0gbXlwYWwsCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTApKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX3JlcHMucGRmIiksIGxhc3RfcGxvdCgpKQpgYGAKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KbWRmIDwtIHJlc2hhcGUyOjptZWx0KGRwbHlyOjpzZWxlY3QocmVzdWx0cywgYygKICAiY2xhc3MiLCAiZGVzZXEubGZjLnBkcyIsICJkZXNlcS5sZmMucGRjIgopKSkKcCA8LSBnZ3Zpb2xpbigKICBtZGYsCiAgeCA9ICJ2YXJpYWJsZSIsCiAgeSA9ICJ2YWx1ZSIsCiAgZmlsbCA9ICJjbGFzcyIsCiAgcGFsZXR0ZSA9IG15cGFsLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoLTMsIDMpKSArIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBjbGFzcyksIGxhYmVsLnkgPSAzLCBzaXplID0gMikKCmFubm90YXRlX2ZpZ3VyZShwLCBmaWcubGFiID0gIkRFU0VxIGZvbGRjaGFuZ2UgbWVhbiB0cmVhdCB2cyBtZWFuIG1vY2ssIG1lZGlhbitpcXIiLCBmaWcubGFiLnNpemUgPSA2KQpnZ3NhdmUoCiAgZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX2xmYy5wZGYiKSwKICBsYXN0X3Bsb3QoKSwKICB3aWR0aCA9IDUsCiAgaGVpZ2h0ID0gNQopCmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpwIDwtIGdnYm94cGxvdCgKICBtZGYsCiAgeCA9ICJ2YXJpYWJsZSIsCiAgeSA9ICJ2YWx1ZSIsCiAgZmlsbCA9ICJjbGFzcyIsCiAgcGFsZXR0ZSA9IG15cGFsCikgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygtMiwgMikpCmFubm90YXRlX2ZpZ3VyZShwLCBmaWcubGFiID0gIkRFU0VxIGZvbGRjaGFuZ2UgbWVhbiB0cmVhdCB2cyBtZWFuIG1vY2ssIG1lZGlhbitpcXIiLCBmaWcubGFiLnNpemUgPSA2KQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfUJveHBsb3RfQ1RDRl9sZmMucGRmIiksIGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTZ9Cm1kZiA8LSByZXNoYXBlMjo6bWVsdChkcGx5cjo6c2VsZWN0KHJlc3VsdHMsIGMoCiAgInBybyIsICJjbGFzcyIsICJkZXNlcS5sZmMucGRzIiwgImRlc2VxLmxmYy5wZGMiCikpKQptZGYkcHJvIDwtIGZhY3RvcihtZGYkcHJvLCBsZXZlbHMgPSBjKCJQcm8iLCAibm9Qcm8iKSkKbWRmJHggPC0gYXMuZmFjdG9yKHBhc3RlMChtZGYkY2xhc3MsICIgIiwgbWRmJHZhcmlhYmxlKSkKbWRmJHggPC0gZmFjdG9yKG1kZiR4LCBsZXZlbHMgPSBsZXZlbHMobWRmJHgpW2MoMiwgMSwgNCwgMyldKQpwIDwtIGdndmlvbGluKAogIG1kZiwKICB4ID0gIngiLAogIHkgPSAidmFsdWUiLAogIGZpbGwgPSAiY2xhc3MiLAogIHBhbGV0dGUgPSBteXBhbCwKICBhZGQgPSAibWVkaWFuX2lxciIsCiAgZmFjZXQuYnkgPSAicHJvIgopICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoLTIsIDIpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmFubm90YXRlX2ZpZ3VyZShwLCBmaWcubGFiID0gIkRFU0VxIGZvbGRjaGFuZ2UgbWVhbiB0cmVhdCB2cyBtZWFuIG1vY2ssIG1lZGlhbitpcXIiLCBmaWcubGFiLnNpemUgPSA2KQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX2xmY19wcm8ucGRmIiksIGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyfQptZWQgPC0gYWdncmVnYXRlKGRlc2VxLmxmYy5wZHMgfiBjbGFzcywKICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0cywKICAgICAgICAgICAgICAgICBGVU4gPSAibWVkaWFuIiwKICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpCm1lZCRkZXNlcS5mYy5wZHMgPC0gMiBeIG1lZCRkZXNlcS5sZmMucGRzCm1lZApgYGAKCmBgYHtyfQptZWQgPC0gYWdncmVnYXRlKGRlc2VxLmxmYy5wZHMgfiBuYW1lLAogICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzLAogICAgICAgICAgICAgICAgIEZVTiA9ICJtZWRpYW4iLAogICAgICAgICAgICAgICAgIG5hLnJtID0gVCkKbWVkJGRlc2VxLmZjLnBkcyA8LSAyIF4gbWVkJGRlc2VxLmxmYy5wZHMKbWVkCmBgYApgYGB7cn0KbWVkIDwtIGFnZ3JlZ2F0ZShkZXNlcS5sZmMucGRzIH4gY2xhc3MsCiAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMsCiAgICAgICAgICAgICAgICAgRlVOID0gIm1lZGlhbiIsCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUKQptZWQkZGVzZXEuZmMucGRzIDwtIDIgXiBtZWQkZGVzZXEubGZjLnBkcwptZWQKYGBgCmBgYHtyfQptZWQgPC0gYWdncmVnYXRlKGRlc2VxLmxmYy5wZGMgfiBuYW1lLAogICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzLAogICAgICAgICAgICAgICAgIEZVTiA9ICJtZWRpYW4iLAogICAgICAgICAgICAgICAgIG5hLnJtID0gVCkKbWVkJGRlc2VxLmZjLnBkYyA8LSAyIF4gbWVkJGRlc2VxLmxmYy5wZGMKbWVkCmBgYAoKYGBge3J9CmRlc2VxX2xmY19zdGF0cyA9IGNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IGNsYXNzLCBkYXRhID0gcmVzdWx0cykKZGVzZXFfbGZjX3N0YXRzCndyaXRlX3RzdihkZXNlcV9sZmNfc3RhdHMsCiAgICAgICAgICBnbHVlKCJ7c3RhdF9vdXRwdXR9cGRzLWRlc2VxMl9sZmNfc3RhdGlzdGljcy50c3YiKSkKCmBgYAoKYGBge3J9CmRlc2VxX2xmY19zdGF0cyA9IGNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkYyB+IGNsYXNzLCBkYXRhID0gcmVzdWx0cykKZGVzZXFfbGZjX3N0YXRzCndyaXRlX3RzdihkZXNlcV9sZmNfc3RhdHMsCiAgICAgICAgICBnbHVlKCJ7c3RhdF9vdXRwdXR9cGhlbmRjLWRlc2VxMl9sZmNfc3RhdGlzdGljcy50c3YiKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD0zfQptZGYgPC0gcmVzaGFwZTI6Om1lbHQoZHBseXI6OnNlbGVjdCgKICByZXN1bHRzLAogIGMoCiAgICAiY2xhc3MiLAogICAgInJhdy5sZmMucGRzXzEiLAogICAgInJhdy5sZmMucGRzXzIiLAogICAgInJhdy5sZmMucGRjXzEiLAogICAgInJhdy5sZmMucGRjXzIiCiAgKQopKQpnZ3Zpb2xpbigKICBtZGYsCiAgeCA9ICJ2YXJpYWJsZSIsCiAgeSA9ICJ2YWx1ZSIsCiAgZmlsbCA9ICJjbGFzcyIsCiAgcGFsZXR0ZSA9IG15cGFsLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoLTMsIDMpKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IGNsYXNzKSwgbGFiZWwueSA9IDMuNiwgc2l6ZSA9IDIpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9VmlvbGluX0NUQ0ZfbGZjX2luZGl2aWR1YWxfcmVwcy5wZGYiKSwgbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dkZW5zaXR5KAogIHJlc3VsdHMsCiAgeCA9ICJyYXcubGZjLnBkcyIsCiAgY29sb3IgPSAiY2xhc3MiLAogIGZpbGwgPSAiY2xhc3MiLAogIHBhbGV0dGUgPSBteXBhbAopICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ2RlbnNpdHkoCiAgcmVzdWx0cywKICB4ID0gInJhdy5sZmMucGRjIiwKICBjb2xvciA9ICJjbGFzcyIsCiAgZmlsbCA9ICJjbGFzcyIsCiAgcGFsZXR0ZSA9IG15cGFsCikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3NjYXR0ZXIoCiAgcmVzdWx0cywKICB4ID0gImxvZzIubW9jayIsCiAgeSA9ICJsb2cyLnBkcyIsCiAgc2l6ZSA9IDEsc2hhcGU9MjAsCiAgYWxwaGEgPSAwLjEsCiAgY29sb3IgPSAiZGVzZXEuc2lnLnBkcyIsCiAgcGFsZXR0ZSA9IG15cGFsW2MoNSwgMildCikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1TY2F0dGVyX0NUQ0ZfREVTRXFfUERTdnNNb2NrLnBkZiIpLCByYXN0ZXJpemUobGFzdF9wbG90KCksZHBpID0gNjAwKSx3aWR0aCA9IDMsIGhlaWdodD0gMy4yKQpgYGAKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NH0KZ2dzY2F0dGVyKAogIHJlc3VsdHMsCiAgeCA9ICJsb2cyLm1vY2siLAogIHkgPSAibG9nMi5wZGMiLAogIHNpemUgPSAxLHNoYXBlPTIwLAogIGFscGhhID0gMC4xLAogIGNvbG9yID0gImRlc2VxLnNpZy5wZGMiLAogIHBhbGV0dGUgPSBteXBhbFtjKDUsIDIpXQopCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9U2NhdHRlcl9DVENGX0RFU0VxX1BoZW5EQzN2c01vY2sucGRmIiksIHJhc3Rlcml6ZShsYXN0X3Bsb3QoKSxkcGkgPSA2MDApLHdpZHRoID0gMywgaGVpZ2h0PSAzLjIpCmBgYApgYGB7cn0KdGIgPC0gdGFibGUocmVzdWx0cyRjbGFzcykKZGVzZXEuc3RhdHMgPC0gYXMuZGF0YS5mcmFtZSh0KGFzLm1hdHJpeCh0YikpKQpkZXNlcS5zdGF0c1sxLF0gPC0gY29sU3VtcyhkZXNlcS5zdGF0cykKcm93bmFtZXMoZGVzZXEuc3RhdHMpIDwtIGMoIlRvdGFsIikKZGVzZXEuc3RhdHMucGVyY2VudCA8LSBkZXNlcS5zdGF0cwpkZXNlcS5zdGF0cy5wZXJjZW50WzEsXSA8LSBjKDEwMCwxMDApCnRiCmBgYAoKYGBge3J9CnRiIDwtIHRhYmxlKHJlc3VsdHMkZGVzZXEuc2lnLnBkcyAmCiAgICAgICAgKHJlc3VsdHMkZGVzZXEubGZjLnBkcyA+IDApLAogICAgICByZXN1bHRzJGNsYXNzKQpkZXNlcS5zdGF0cyA8LSByYmluZChkZXNlcS5zdGF0cywgUERTLnNpZy51cCA9IGFzLmRhdGEuZnJhbWUubWF0cml4KHRiKVsyLF0pCnRiCmBgYApgYGB7cn0KdGIgPC0gcHJvcC50YWJsZSh0YWJsZShyZXN1bHRzJGRlc2VxLnNpZy5wZHMgJgogICAgICAgIChyZXN1bHRzJGRlc2VxLmxmYy5wZHMgPiAwKSwKICAgICAgcmVzdWx0cyRjbGFzcyksbWFyZ2luID0gMikqMTAwCmRlc2VxLnN0YXRzLnBlcmNlbnQgPC0gcmJpbmQoZGVzZXEuc3RhdHMucGVyY2VudCwgUERTLnNpZy51cCAgPSBhcy5kYXRhLmZyYW1lLm1hdHJpeCh0YilbMixdKQp0YgpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTIuNX0KdGFibGUocmVzdWx0cyRkZXNlcS5zaWcucGRzICYKICAgICAgICAocmVzdWx0cyRkZXNlcS5sZmMucGRzID4gMCksCiAgICAgIHJlc3VsdHMkY2xhc3MpCm1kZiA8LSByZXNoYXBlMjo6bWVsdCh0YWJsZSgKICByZXN1bHRzJGRlc2VxLnNpZy5wZHMgJiAocmVzdWx0cyRkZXNlcS5sZmMucGRzID4gMCksCiAgcmVzdWx0cyRjbGFzcwopKQpnZ3Bsb3QobWRmLCBhZXMoVmFyMSwgVmFyMiwgZmlsbCA9IHZhbHVlKSkgKwogIGdlb21fdGlsZShzaG93LmxlZ2VuZCA9IEYpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHZhbHVlKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJvcmFuZ2UiKSArIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQp2bCA8LSBsaXN0KAogIHNpZyA9IGdyZXAoIlRSVUUiLCByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcyksCiAgQ1RDRl9HNCA9IGdyZXAoImFuZCIsIHJlc3VsdHMkY2xhc3MpLAogIENUQ0Zvbmx5ID0gZ3JlcCgibm90IiwgcmVzdWx0cyRjbGFzcykKKQpwbG90KGV1bGVyKHZsKSwgcXVhbnRpdGllcyA9IFQpCmBgYAoKYGBge3J9CnRiIDwtIHRhYmxlKHJlc3VsdHMkZGVzZXEuc2lnLnBkYyAmCiAgICAgICAgKHJlc3VsdHMkZGVzZXEubGZjLnBkYyA+IDApLAogICAgICByZXN1bHRzJGNsYXNzKQpkZXNlcS5zdGF0cyA8LSByYmluZChkZXNlcS5zdGF0cywgUGhlbkRDMy5zaWcudXAgPSBhcy5kYXRhLmZyYW1lLm1hdHJpeCh0YilbMixdKQp0YgpgYGAKYGBge3J9CnRhYmxlKHJlc3VsdHMkZGVzZXEuc2lnLnBkYyAmCiAgICAgICAgKHJlc3VsdHMkZGVzZXEubGZjLnBkYyA8IDApLAogICAgICByZXN1bHRzJGNsYXNzKQpgYGAKCgpgYGB7cn0KdGIgPC0gcHJvcC50YWJsZSh0YWJsZShyZXN1bHRzJGRlc2VxLnNpZy5wZGMgJgogICAgICAgIChyZXN1bHRzJGRlc2VxLmxmYy5wZGMgPiAwKSwKICAgICAgcmVzdWx0cyRjbGFzcyksbWFyZ2luID0gMikqMTAwCmRlc2VxLnN0YXRzLnBlcmNlbnQgPC0gcmJpbmQoZGVzZXEuc3RhdHMucGVyY2VudCwgUGhlbkRDMy5zaWcudXAgPSBhcy5kYXRhLmZyYW1lLm1hdHJpeCh0YilbMixdKQp0YgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0yLjV9CnRhYmxlKHJlc3VsdHMkZGVzZXEuc2lnLnBkYyAmCiAgICAgICAgKHJlc3VsdHMkZGVzZXEubGZjLnBkYyA+IDApLAogICAgICByZXN1bHRzJGNsYXNzKQptZGYgPC0gcmVzaGFwZTI6Om1lbHQodGFibGUoCiAgcmVzdWx0cyRkZXNlcS5zaWcucGRjICYgKHJlc3VsdHMkZGVzZXEubGZjLnBkYyA+IDApLAogIHJlc3VsdHMkY2xhc3MKKSkKZ2dwbG90KG1kZiwgYWVzKFZhcjEsIFZhcjIsIGZpbGwgPSB2YWx1ZSkpICsKICBnZW9tX3RpbGUoc2hvdy5sZWdlbmQgPSBGKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAib3JhbmdlIikgKyB0aGVtZV9taW5pbWFsKCkKYGBgCgoKYGBge3J9CnJlc3VsdHMkdWlkIDwtIHNlcSgxOm5yb3cocmVzdWx0cykpCnZsIDwtIGxpc3QoCiAgc2lnID0gZ3JlcCgiVFJVRSIsIHJlc3VsdHMkZGVzZXEuc2lndXAucGRjKSwKICBDVENGX0c0ID0gZ3JlcCgiYW5kIiwgcmVzdWx0cyRjbGFzcyksCiAgQ1RDRm9ubHkgPSBncmVwKCJub3QiLCByZXN1bHRzJGNsYXNzKQopCnBsb3QoZXVsZXIodmwpLCBxdWFudGl0aWVzID0gVCkKYGBgCiAKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9Mi41fQp0YWJsZShyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcywgcmVzdWx0cyRkZXNlcS5zaWd1cC5wZGMpCm1kZiA8LSByZXNoYXBlMjo6bWVsdCh0YWJsZShyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcywgcmVzdWx0cyRkZXNlcS5zaWd1cC5wZGMpKQpnZ3Bsb3QobWRmLCBhZXMoVmFyMSwgVmFyMiwgZmlsbCA9IHZhbHVlKSkgKwogIGdlb21fdGlsZShzaG93LmxlZ2VuZCA9IEYpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHZhbHVlKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJvcmFuZ2UiKSArIHRoZW1lX21pbmltYWwoKQpgYGAKYGBge3J9CnRiIDwtIHRhYmxlKHJlc3VsdHMkZGVzZXEuc2lndXAucGRzICYgcmVzdWx0cyRkZXNlcS5zaWd1cC5wZGMsCiAgICAgIHJlc3VsdHMkY2xhc3MpCmRlc2VxLnN0YXRzIDwtIHJiaW5kKGRlc2VxLnN0YXRzLCBib3RoLnNpZy51cCA9IGFzLmRhdGEuZnJhbWUubWF0cml4KHRiKVsyLF0pCnRiCmBgYAoKYGBge3J9CnRiIDwtIHByb3AudGFibGUodGFibGUocmVzdWx0cyRkZXNlcS5zaWd1cC5wZHMgJiByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkYywKICAgICAgcmVzdWx0cyRjbGFzcyksbWFyZ2luID0gMikqMTAwCmRlc2VxLnN0YXRzLnBlcmNlbnQgPC0gcmJpbmQoZGVzZXEuc3RhdHMucGVyY2VudCwgYm90aCA9IGFzLmRhdGEuZnJhbWUubWF0cml4KHRiKVsyLF0pCnRiCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9Mi41fQp0YWJsZShyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcyAmIHJlc3VsdHMkZGVzZXEuc2lndXAucGRjLCByZXN1bHRzJGNsYXNzKQptZGYgPC0gcmVzaGFwZTI6Om1lbHQodGFibGUocmVzdWx0cyRkZXNlcS5zaWd1cC5wZHMgJiByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkYywgcmVzdWx0cyRjbGFzcykpCmdncGxvdChtZGYsIGFlcyhWYXIxLCBWYXIyLCBmaWxsID0gdmFsdWUpKSArCiAgZ2VvbV90aWxlKHNob3cubGVnZW5kID0gRikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gdmFsdWUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIm9yYW5nZSIpICsgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3IgZmlnLndpZHRoPTIuNSwgZmlnLmhlaWdodD0yLjV9CmRlc2VxLnN0YXRzJGNsYXNzIDwtIHJvd25hbWVzKGRlc2VxLnN0YXRzKSAKbWRmIDwtIHJlc2hhcGUyOjptZWx0KGRlc2VxLnN0YXRzKQpnZ3Bsb3QobWRmLCBhZXModmFyaWFibGUsIGNsYXNzLCBmaWxsID0gdmFsdWUpKSArCiAgZ2VvbV90aWxlKHNob3cubGVnZW5kID0gRikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gdmFsdWUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIm9yYW5nZSIpICsgdGhlbWVfbWluaW1hbCgpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9VGFibGVfQ1RDRl9ERVNFcV9TaWd1cC5wZGYiKSwgcmFzdGVyaXplKGxhc3RfcGxvdCgpLGRwaSA9IDYwMCksd2lkdGggPSAyLjUsIGhlaWdodD0gMi41KQpgYGAKYGBge3IgZmlnLndpZHRoPTIuNSwgZmlnLmhlaWdodD0yLjV9CmRlc2VxLnN0YXRzLnBlcmNlbnQkY2xhc3MgPC0gcm93bmFtZXMoZGVzZXEuc3RhdHMucGVyY2VudCkgCm1kZiA8LSByZXNoYXBlMjo6bWVsdChkZXNlcS5zdGF0cy5wZXJjZW50Wy0xLF0pCmdncGxvdChtZGYsIGFlcyh2YXJpYWJsZSwgY2xhc3MsIGZpbGwgPSB2YWx1ZSkpICsKICBnZW9tX3RpbGUoc2hvdy5sZWdlbmQgPSBGKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtZGYkdmFsdWUsMikpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIm9yYW5nZSIpICsgdGhlbWVfbWluaW1hbCgpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9VGFibGVfQ1RDRl9ERVNFcV9TaWd1cF9wZXJjZW50LnBkZiIpLCByYXN0ZXJpemUobGFzdF9wbG90KCksZHBpID0gNjAwKSx3aWR0aCA9IDIuNSwgaGVpZ2h0PSAyLjUpCmBgYAoKYGBge3J9CnZsIDwtIGxpc3QoCiAgc2lnX1BEUyA9IGdyZXAoIlRSVUUiLCByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcyksCiAgc2lnX1BEQyA9IGdyZXAoIlRSVUUiLCByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkYyksCiAgQ1RDRl9HNCA9IGdyZXAoImFuZCIsIHJlc3VsdHMkY2xhc3MpLAogIENUQ0Zvbmx5ID0gZ3JlcCgibm90IiwgcmVzdWx0cyRjbGFzcykKKQpwbG90KGV1bGVyKHZsKSwgcXVhbnRpdGllcyA9IFQpCmBgYAoKYGBge3J9CnJlc3VsdHMkdWlkIDwtIHNlcSgxOm5yb3cocmVzdWx0cykpCnZsIDwtIGxpc3QoCiAgc2lnX1BEUyA9IGdyZXAoIlRSVUUiLCByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcyksCiAgc2lnX1BEQyA9IGdyZXAoIlRSVUUiLCByZXN1bHRzJGRlc2VxLnNpZ3VwLnBkYyksCiAgQ1RDRl9HNCA9IGdyZXAoImFuZCIsIHJlc3VsdHMkY2xhc3MpCikKcGxvdChldWxlcih2bCksIHF1YW50aXRpZXMgPSBUKQpgYGAKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Nn0KcmVzdWx0cyRzaWcuYnkuY2xhc3MucGRzIDwtIHBhc3RlMChyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcywgIl8iLCByZXN1bHRzJGNsYXNzKQpyZXN1bHRzJHBzaXplIDwtIDAuMDEKcmVzdWx0cyRwc2l6ZVtyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcyAmCiAgICAgICAgICAgICAgICByZXN1bHRzJGNsYXNzID09ICJDVENGX2FuZF9HNCJdIDwtIDEKCmdnc2NhdHRlcigKICByZXN1bHRzLAogIHggPSAibG9nMi5tb2NrIiwKICB5ID0gImxvZzIucGRzIiwKICBzaXplID0gMC41LAogIGFscGhhID0gcmVzdWx0cyRwc2l6ZSwKICBjb2xvciA9ICJzaWcuYnkuY2xhc3MucGRzIiwKICBwYWxldHRlID0gYyhteXBhbFs1XSwgbXlwYWxbNV0sIG15cGFsWzVdLCBteXBhbFsyXSwgbXlwYWxbMV0pCikKYGBgCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTZ9Cmdnc2NhdHRlcigKICByZXN1bHRzWyFncmVwbCgiTkEiLCByZXN1bHRzJHNpZy5ieS5jbGFzcy5wZHMpLCBdLAogIHggPSAibG9nMi5tb2NrIiwKICB5ID0gImRlc2VxLmxmYy5wZHMiLAogIHNpemUgPSAwLjIsCiAgYWxwaGEgPSAicHNpemUiLAogIGNvbG9yID0gInNpZy5ieS5jbGFzcy5wZHMiLAogIHBhbGV0dGUgPSBjKCIjNTA1MDUwIiwgIiM1MDUwNTAiLCAicmVkMiIsICJibHVlIikKKQpgYGAKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTV9Cmdnc2NhdHRlcmhpc3QoCiAgcmVzdWx0c1shZ3JlcGwoIk5BIiwgcmVzdWx0cyRzaWcuYnkuY2xhc3MucGRzKSwgXSwKICB4ID0gImxvZzIubW9jayIsCiAgeSA9ICJsb2cyLnBkcyIsCiAgc2l6ZSA9IDAuNCwKICBhbHBoYSA9ICJwc2l6ZSIsCiAgY29sb3IgPSAic2lnLmJ5LmNsYXNzLnBkcyIsCiAgbWFyZ2luLnBhcmFtcyA9IGxpc3QoCiAgICBmaWxsID0gInNpZy5ieS5jbGFzcy5wZHMiLAogICAgY29sb3IgPSAiYmxhY2siLAogICAgc2l6ZSA9IDAuMgogICksCiAgcGFsZXR0ZSA9IGMoIiM1MDUwNTAiLCAiIzUwNTA1MCIsICJyZWQyIiwgImJsdWUiKQopCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzY2F0dGVyKAogIHJlc3VsdHMsCiAgeCA9ICJyYXcubGZjLnBkcyIsCiAgeSA9ICJsb2cyLkc0IiwKICBzaXplID0gMC4yLAogIGFscGhhID0gMC4xLAogIGNvbG9yID0gImRlc2VxLnNpZy5wZHMiLAogIGNvci5jb2VmID0gVCwKICBwYWxldHRlID0gYygiIzg4ODg4OCIsbXlwYWxbMl0pCikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1TY2F0dGVyX0c0X3ZzX0xGQ19QRFMucGRmIiksCiAgICAgICBwbG90ID0gcmFzdGVyaXplKGxhc3RfcGxvdCgpKSkKYGBgCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Cmdnc2NhdHRlcigKICByZXN1bHRzLAogIHggPSAicmF3LmxmYy5wZGMiLAogIHkgPSAibG9nMi5HNCIsCiAgc2l6ZSA9IDAuMiwKICBhbHBoYSA9IDAuMSwKICBjb2xvciA9ICJkZXNlcS5zaWcucGRjIiwKICBjb3IuY29lZiA9IFQsCiAgcGFsZXR0ZSA9IGMoIiM4ODg4ODgiLG15cGFsWzJdKQopCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9U2NhdHRlcl9HNF92c19MRkNfUERDLnBkZiIpLAogICAgICAgcGxvdCA9IHJhc3Rlcml6ZShsYXN0X3Bsb3QoKSkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KcmVzdWx0cyRHNC5xdWFudGlsZSA8LSBkcGx5cjo6bnRpbGUocmVzdWx0cyRHNF9OVCwgbiA9IDUpCnJlc3VsdHMkcGRzLnF1YW50aWxlIDwtIGRwbHlyOjpudGlsZShyZXN1bHRzJG1lYW4ucGRzLXJlc3VsdHMkbWVhbi5tb2NrLCBuID0gNCkKcmVzdWx0cyRwZGMucXVhbnRpbGUgPC0gZHBseXI6Om50aWxlKHJlc3VsdHMkbWVhbi5wZGMtcmVzdWx0cyRtZWFuLm1vY2ssIG4gPSA0KQpgYGAKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnRvcDI1LnBkcyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1tyZXN1bHRzJHBkcy5xdWFudGlsZT09NCwxOjNdLG5hLnJtPVQpCmJvdDc1LnBkcyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1tyZXN1bHRzJHBkcy5xdWFudGlsZSE9NCwxOjNdLG5hLnJtPVQpCnRvcDI1LnBkcy5DVENGX0c0IDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXN1bHRzWyhyZXN1bHRzJHBkcy5xdWFudGlsZT09NCAmIHJlc3VsdHMkY2xhc3MgPT0gIkNUQ0ZfYW5kX0c0IiksMTozXSxuYS5ybT1UKQp0b3AyNS5wZHMuQ1RDRl9vbmx5IDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXN1bHRzWyhyZXN1bHRzJHBkcy5xdWFudGlsZT09NCAgJiAgcmVzdWx0cyRjbGFzcyA9PSAiQ1RDRl9ub3RfRzQiKSwxOjNdLG5hLnJtPVQpCmBgYAoKYGBge3J9CnRvcDI1LnBkYyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1tyZXN1bHRzJHBkYy5xdWFudGlsZT09NCwxOjNdLG5hLnJtPVQpCmJvdDc1LnBkYyA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1tyZXN1bHRzJHBkYy5xdWFudGlsZSE9NCwxOjNdLG5hLnJtPVQpCnRvcDI1LnBkYy5DVENGX0c0IDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXN1bHRzWyhyZXN1bHRzJHBkYy5xdWFudGlsZT09NCAmIHJlc3VsdHMkY2xhc3MgPT0gIkNUQ0ZfYW5kX0c0IiksMTozXSxuYS5ybT1UKQp0b3AyNS5wZGMuQ1RDRl9vbmx5IDwtIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXN1bHRzWyhyZXN1bHRzJHBkYy5xdWFudGlsZT09NCAgJiAgcmVzdWx0cyRjbGFzcyA9PSAiQ1RDRl9ub3RfRzQiKSwxOjNdLG5hLnJtPVQpCgpgYGAKCgpgYGB7cn0KdmwgPC0gbGlzdCgKICBDVENGX0c0ID0gdG9wMjUucGRzLkNUQ0ZfRzQsCiAgQ1RDRl9vbmx5ID0gdG9wMjUucGRzLkNUQ0Zfb25seSwKICBHNG1vdGlmID0gcnRyYWNrbGF5ZXI6OmltcG9ydCgiLi4vZGF0YS9wZWFrcy9HNEhfbW0xMF8xLjc1LmJlZCIpCikKYmVkc2NvdXQ6OnBsb3RfZXVsZXIoZ3JsaXN0ID0gdmwsbmFtZXMgPSBjKCJDVENGX0c0IiwiQ1RDRl9vbmx5IiwiRzRtb3RpZiIpKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAicGRzLnF1YW50aWxlIiwKICB5ID0gImRlc2VxLmxmYy5wZHMiLAogIGZpbGwgPSBteXBhbFszXSwKICBhZGQgPSAibWVkaWFuX2lxciIKKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMS41LCAxLjUpKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3R0ZWQiKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9sZmNQRFNfYnlfUERTcXVhbnRpbGUucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gInBkYy5xdWFudGlsZSIsCiAgeSA9ICJkZXNlcS5sZmMucGRjIiwKICBmaWxsID0gbXlwYWxbM10sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEuNSwgMS41KSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG90dGVkIikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fbGZjUERTX2J5X1BoZW5EQzNxdWFudGlsZS5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9M30KdGIgPC0gdGFibGUocmVzdWx0cyRwZHMucXVhbnRpbGUsIHJlc3VsdHMkY2xhc3MpCnRiCmdnYmFycGxvdChhcy5kYXRhLmZyYW1lKHQoYXMubWF0cml4KHRiKSkpLCJWYXIyIiwiRnJlcSIsZmlsbD0iVmFyMSIscGFsZXR0ZSA9IGMobXlwYWxbMV0sIiNhYWFhYWEiKSxsYWJlbCA9IFRSVUUsIGxhYi5wb3M9ImluIix5bGltPWMoMTEwMDAsMTMwMDApKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfUJhcnBsb3RfcGVha0NhdF9ieV9QRFNxdWFudGlsZS5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTN9Ckc0Lm1vdGlmcyA8LSBydHJhY2tsYXllcjo6aW1wb3J0KCcuLi9kYXRhL3BlYWtzL0c0SF9tbTEwXzEuNzUuYmVkJykKRzQubW90aWZzJHR5cGUgPSByZXAoIkc0IixsZW5ndGgoRzQubW90aWZzKSkKb2wgPC0gIGJlZHNjb3V0Ojphbm5vdGF0ZV9vdmVybGFwcGluZ19mZWF0dXJlcyggbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJlc3VsdHNbLDE6M10sbmEucm09VCksZmVhdF9nciA9IEc0Lm1vdGlmcyxuYW1lX2ZpZWxkID0gInR5cGUiKSRuZWFyYnlfZmVhdHVyZXMKb2xbaXMubmEob2wpXSA8LSAibm9uZSIKCnRiIDwtIHRhYmxlKHJlc3VsdHMkcGRzLnF1YW50aWxlLFZhcjE9b2wpCiAgICAgICAgICAgICAgCnRiCgpnZ2JhcnBsb3QoYXMuZGF0YS5mcmFtZSh0KGFzLm1hdHJpeCh0YikpKSwiVmFyMiIsIkZyZXEiLGZpbGw9IlZhcjEiLHBhbGV0dGUgPSBjKG15cGFsWzFdLCIjYWFhYWFhIiksbGFiZWwgPSBUUlVFLCBsYWIucG9zPSJpbiIseWxpbT1jKDExMDAwLDEzMDAwKSkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1CYXJwbG90X0c0bW90aWZfYnlfUERTcXVhbnRpbGUucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3J9CnRhYmxlKG9sLHJlc3VsdHMkcGRzLnF1YW50aWxlLCAgcmVzdWx0cyRjbGFzcykKYGBgCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTN9CnRiIDwtIHRhYmxlKHJlc3VsdHMkcGRjLnF1YW50aWxlLCByZXN1bHRzJGNsYXNzKQp0YgpnZ2JhcnBsb3QoYXMuZGF0YS5mcmFtZSh0KGFzLm1hdHJpeCh0YikpKSwiVmFyMiIsIkZyZXEiLGZpbGw9IlZhcjEiLHBhbGV0dGUgPSBjKG15cGFsWzFdLCIjYWFhYWFhIiksbGFiZWwgPSBUUlVFLCBsYWIucG9zPSJpbiIseWxpbT1jKDExMDAwLDEzMDAwKSkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1CYXJwbG90X3BlYWtDYXRfYnlfUGhlbkRDM3F1YW50aWxlLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLGxvY2kgPSB0b3AyNS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDYpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLGxvY2kgPSBib3Q3NS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDYpKQpnZ2FycmFuZ2UocDEscDIsIG5jb2w9MikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1Qcm9maWxlX0NUQ0ZfdG9wMjVfUERTcXVhbnRpbGUucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQp0b3AyNS5wZGMgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJlc3VsdHNbcmVzdWx0cyRwZGMucXVhbnRpbGU9PTQsMTozXSxuYS5ybT1UKQpib3Q3NS5wZGMgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKHJlc3VsdHNbcmVzdWx0cyRwZGMucXVhbnRpbGUhPTQsMTozXSxuYS5ybT1UKQpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLGxvY2kgPSB0b3AyNS5wZGMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDYpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLGxvY2kgPSBib3Q3NS5wZGMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDYpKQpnZ2FycmFuZ2UocDEscDIsIG5jb2w9MikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1Qcm9maWxlX0NUQ0ZfdG9wMjVfUGhlbkRDM3F1YW50aWxlLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnAxIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMTozXSxsb2NpID0gdG9wMjUucGRzLkNUQ0ZfRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1sxOjNdLGxvY2kgPSB0b3AyNS5wZHMuQ1RDRl9vbmx5LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxMCkpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVByb2ZpbGVfQ1RDRl90b3AyNV9QRFNxdWFudGlsZV9ieUc0b3ZlcmxhcC5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQp0b3AyNS5wZGMuQ1RDRl9HNCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1socmVzdWx0cyRwZGMucXVhbnRpbGU9PTQgJiByZXN1bHRzJGNsYXNzID09ICJDVENGX2FuZF9HNCIpLDE6M10sbmEucm09VCkKdG9wMjUucGRjLkNUQ0Zfb25seSA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1socmVzdWx0cyRwZGMucXVhbnRpbGU9PTQgICYgIHJlc3VsdHMkY2xhc3MgPT0gIkNUQ0Zfbm90X0c0IiksMTozXSxuYS5ybT1UKQoKcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1tjKDEsMyldLGxvY2kgPSB0b3AyNS5wZGMuQ1RDRl9HNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFtjKDEsMyldKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxMCkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbYygxLDMpXSxsb2NpID0gdG9wMjUucGRjLkNUQ0Zfb25seSwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFtjKDEsMyldKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxMCkpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVByb2ZpbGVfQ1RDRl90b3AyNV9QaGVuREMzcXVhbnRpbGVfYnlHNG92ZXJsYXAucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1tjKDIsMyldLGJnX2J3ZmlsZXMgPSAgYyhnZW9fYmlnd2lnc1sxXSxnZW9fYmlnd2lnc1sxXSksIGxvY2kgPSB0b3AyNS5wZHMuQ1RDRl9HNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFtjKDIsMyldLG5vcm1fbW9kZSA9ICJsb2cyZmMiLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTEsMSkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbYygyLDMpXSxiZ19id2ZpbGVzID0gYyhnZW9fYmlnd2lnc1sxXSxnZW9fYmlnd2lnc1sxXSksIGxvY2kgPSB0b3AyNS5wZHMuQ1RDRl9vbmx5LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsW2MoMiwzKV0sbm9ybV9tb2RlID0gImxvZzJmYyIsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMSwxKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9UHJvZmlsZV9DVENGZm9sZGNoYW5nZV90b3AyNV9QRFNxdWFudGlsZV9ieUc0LnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1szXSxiZ19id2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMV0sIGxvY2kgPSB0b3AyNS5wZGMuQ1RDRl9HNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFszXSxub3JtX21vZGUgPSAibG9nMmZjIixzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0xLDEpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzWzNdLGJnX2J3ZmlsZXMgPSBnZW9fYmlnd2lnc1sxXSwgbG9jaSA9IHRvcDI1LnBkYy5DVENGX29ubHksIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbM10sbm9ybV9tb2RlID0gImxvZzJmYyIsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMSwxKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9UHJvZmlsZV9DVENGZm9sZGNoYW5nZV90b3AyNV9QaGVuREMzcXVhbnRpbGVfYnlHNC5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zfQojZ2VvX0NuUl9iaWd3aWdzIDwtIGxpc3QuZmlsZXMoIi4uL21lbmRlbGV5L2FkZGl0aW9uYWwvIiwiX0c0LmJ3IixmdWxsLm5hbWVzID0gVCkKcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMToyXSwgbG9jaSA9IHRvcDI1LnBkcywgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTUpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxOjJdLCBsb2NpID0gYm90NzUucGRzLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCnAzIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzE6Ml0sIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9Db250cm9sX3BlYWtzX3NodWZmbGVkLmJlZCIsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDE1KSkKZ2dhcnJhbmdlKHAxLHAyLHAzLCBuY29sPTMpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9UHJvZmlsZV9HNGF0Q1RDRnBlYWtzX3BlcmNlbnRpbGVzLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KY2xvc0c0IDwtIGJlZHNjb3V0Ojphbm5vdGF0ZV9uZWFyYnlfZmVhdHVyZXMoRzQubW90aWZzLGZlYXRfZ3IgPSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1ssYygxLDIsMyw4KV0sa2VlcC5leHRyYS5jb2x1bW5zID0gVCksbmFtZV9maWVsZCA9ICJuYW1lIixkaXN0YW5jZV9jdXRvZmYgPSAxMDAwKQpjbG9zRzQgPC0gY2xvc0c0WyFpcy5uYShjbG9zRzQkbmVhcmJ5X2ZlYXR1cmVzKSxdCnAzIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gYygnLi4vbWVuZGVsZXkvYWRkaXRpb25hbC9HNC5tbTEwLnBsdXMuYncnLCcuLi9tZW5kZWxleS9hZGRpdGlvbmFsL0c0Lm1tMTAubWludXMuYncnKSwgbG9jaSA9IGNsb3NHNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBjKCIjRkZBQUZGIiwiI0REQkJGRiIpLHNob3dfZXJyb3IgPSBUKQpwNCA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxOjJdLCBsb2NpID0gY2xvc0c0LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCnA1IDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzJdLCBiZ19id2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzFdLCBub3JtX21vZGUgPSAibG9nMmZjIiwgbG9jaSA9IGNsb3NHNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFsyXSxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0yLDIpKQpnZ2FycmFuZ2UocDMscDQscDUsbmNvbD0zKQpgYGAKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CnAxIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzM6NF0sIGxvY2kgPSB0b3AyNS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDE1KSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMzo0XSwgbG9jaSA9IGJvdDc1LnBkcywgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTUpKQpwMyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1szOjRdLCBsb2NpID0gIi4uL2RhdGEvcGVha3MvQ29udHJvbF9wZWFrc19zaHVmZmxlZC5iZWQiLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCmdnYXJyYW5nZShwMSxwMixwMywgbmNvbD0zKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVByb2ZpbGVfUGhlbkRDM19HNGF0Q1RDRnBlYWtzX1BEU3BlcmNlbnRpbGVzLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CnAxIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzE6Ml0sIGxvY2kgPSB0b3AyNS5wZHMuQ1RDRl9HNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTUpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxOjJdLCBsb2NpID0gdG9wMjUucGRzLkNUQ0Zfb25seSwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTUpKQpwMyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxOjJdLCBsb2NpID0gIi4uL2RhdGEvcGVha3MvQ29udHJvbF9wZWFrc19zaHVmZmxlZC5iZWQiLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCmdnYXJyYW5nZShwMSxwMixwMywgbmNvbD0zKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVByb2ZpbGVfRzRhdENUQ0ZwZWFrc19ieUc0LnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CnAxIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzJdLCBiZ19id2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzFdLCBub3JtX21vZGUgPSAibG9nMmZjIiwgbG9jaSA9IHRvcDI1LnBkcywgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFsyXSxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0yLDIpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1syXSwgYmdfYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxXSwgbm9ybV9tb2RlID0gImxvZzJmYyIsIGxvY2kgPSBib3Q3NS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMiwyKSkKcDMgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMl0sIGJnX2J3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMV0sIG5vcm1fbW9kZSA9ICJsb2cyZmMiLCBsb2NpID0gIi4uL2RhdGEvcGVha3MvQ29udHJvbF9wZWFrc19zaHVmZmxlZC5iZWQiLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsWzJdLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTIsMikpCmdnYXJyYW5nZShwMSxwMixwMywgbmNvbD0zKQpgYGAKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KcDQgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMToyXSwgbG9jaSA9ICIuLi9kYXRhL3BlYWtzL0c0SF9tbTEwXzEuNzUuYmVkIiwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTUpKQpwNSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1syXSwgYmdfYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxXSwgbm9ybV9tb2RlID0gImxvZzJmYyIsIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9HNEhfbW0xMF8xLjc1LmJlZCIsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMiwyKSkKZ2dhcnJhbmdlKHA0LHA0LHA1LCBuY29sPTMpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9UHJvZmlsZV9HNGF0RzRtb3RpZnMucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMl0sIGJnX2J3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMV0sIG5vcm1fbW9kZSA9ICJsb2cyZmMiLCBsb2NpID0gdG9wMjUucGRzLkNUQ0ZfRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMiwyKSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMl0sIGJnX2J3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMV0sIG5vcm1fbW9kZSA9ICJsb2cyZmMiLCBsb2NpID0gdG9wMjUucGRzLkNUQ0Zfb25seSwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFsyXSxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0yLDIpKQpwMyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1syXSwgYmdfYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxXSwgbm9ybV9tb2RlID0gImxvZzJmYyIsIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9Db250cm9sX3BlYWtzX3NodWZmbGVkLmJlZCIsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMiwyKSkKZ2dhcnJhbmdlKHAxLHAyLHAzLCBuY29sPTMpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMzo0XSwgbG9jaSA9IHRvcDI1LnBkYy5DVENGX0c0LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzM6NF0sIGxvY2kgPSB0b3AyNS5wZGMuQ1RDRl9vbmx5LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNSkpCnAzIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzM6NF0sIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9Db250cm9sX3BlYWtzX3NodWZmbGVkLmJlZCIsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDE1KSkKZ2dhcnJhbmdlKHAxLHAyLHAzLCBuY29sPTMpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbNF0sIGJnX2J3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbM10sIG5vcm1fbW9kZSA9ICJsb2cyZmMiLCBsb2NpID0gdG9wMjUucGRjLkNUQ0ZfRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMiwyKSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbNF0sIGJnX2J3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbM10sIG5vcm1fbW9kZSA9ICJsb2cyZmMiLCBsb2NpID0gdG9wMjUucGRjLkNUQ0Zfb25seSwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFsyXSxzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0yLDIpKQpwMyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1s0XSwgYmdfYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1szXSwgbm9ybV9tb2RlID0gImxvZzJmYyIsIGxvY2kgPSAiLi4vZGF0YS9wZWFrcy9Db250cm9sX3BlYWtzX3NodWZmbGVkLmJlZCIsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMiwyKSkKZ2dhcnJhbmdlKHAxLHAyLHAzLCBuY29sPTMpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KZGYxIDwtICBkYXRhLmZyYW1lKHNldD0idG9wMjVfQ1RDRl9HNCIsIGFzLmRhdGEuZnJhbWUoYndfbG9jaShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzE6Ml0sbG9jaT10b3AyNS5wZHMuQ1RDRl9HNCwgbGFiZWxzPWMoIk1vY2siLCJQRFMiKSkpWyw2OjddKQpkZjIgPC0gZGF0YS5mcmFtZShzZXQ9InRvcDI1X0NUQ0Zfb25seSIsIGFzLmRhdGEuZnJhbWUoYndfbG9jaShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzE6Ml0sbG9jaT10b3AyNS5wZHMuQ1RDRl9vbmx5LCBsYWJlbHM9YygiTW9jayIsIlBEUyIpKSlbLDY6N10pCmRmMyA8LSBkYXRhLmZyYW1lKHNldD0iYm90dG9tNzUiLCBhcy5kYXRhLmZyYW1lKGJ3X2xvY2koYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1sxOjJdLGxvY2k9Ym90NzUucGRzLCBsYWJlbHM9YygiTW9jayIsIlBEUyIpKSlbLDY6N10pCmRmNCA8LSBkYXRhLmZyYW1lKHNldD0iUmFuZG9tIiwgYXMuZGF0YS5mcmFtZShid19sb2NpKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMToyXSwgbG9jaT0iLi4vZGF0YS9wZWFrcy9Db250cm9sX3BlYWtzX3NodWZmbGVkLmJlZCIsIGxhYmVscz1jKCJNb2NrIiwiUERTIikpKVssNjo3XSkKZGYgPC0gcmJpbmQoZGYxLGRmMixkZjMsZGY0KQpkZiRsZmMucGRzIDwtIGxvZzIoZGYkUERTL2RmJE1vY2spCmRmJGRpZmYucGRzIDwtIGRmJFBEUyAtIGRmJE1vY2sKbWRmIDwtIG1lbHQoZGYpCm1kZiRsZzIgPC0gbG9nMihtZGYkdmFsdWUpCmdndmlvbGluKG1kZlttZGYkdmFyaWFibGUgJWluJSBjKCJNb2NrIiwiUERTIiksXSwgInNldCIsImxnMiIsZmlsbD0idmFyaWFibGUiLHBhbGV0dGUgPSBteXBhbCwgYWRkPSJtZWRpYW5faXFyIikKYGBgCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTN9CmdndmlvbGluKG1kZlttZGYkdmFyaWFibGUgJWluJSAibGZjLnBkcyIsXSwgInNldCIsInZhbHVlIixmaWxsPSJ2YXJpYWJsZSIscGFsZXR0ZSA9IG15cGFsLCBhZGQ9Im1lZGlhbl9pcXIiKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApCmBgYAoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9M30KZ2d2aW9saW4obWRmW21kZiR2YXJpYWJsZSAlaW4lICJkaWZmLnBkcyIsXSwgInNldCIsInZhbHVlIixmaWxsPSJ2YXJpYWJsZSIscGFsZXR0ZSA9IG15cGFsLCBhZGQ9Im1lZGlhbl9pcXIiKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMjAsMjApKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KZGYxIDwtICBkYXRhLmZyYW1lKHNldD0idG9wMjVfQ1RDRl9HNCIsIGFzLmRhdGEuZnJhbWUoYndfbG9jaShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzM6NF0sbG9jaT10b3AyNS5wZGMuQ1RDRl9HNCwgbGFiZWxzPWMoIk1vY2siLCJQREMiKSkpWyw2OjddKQpkZjIgPC0gZGF0YS5mcmFtZShzZXQ9InRvcDI1X0NUQ0Zfb25seSIsIGFzLmRhdGEuZnJhbWUoYndfbG9jaShid2ZpbGVzID0gZ2VvX0NuUl9iaWd3aWdzWzM6NF0sbG9jaT10b3AyNS5wZGMuQ1RDRl9vbmx5LCBsYWJlbHM9YygiTW9jayIsIlBEQyIpKSlbLDY6N10pCmRmMyA8LSBkYXRhLmZyYW1lKHNldD0iYm90dG9tNzUiLCBhcy5kYXRhLmZyYW1lKGJ3X2xvY2koYndmaWxlcyA9IGdlb19DblJfYmlnd2lnc1szOjRdLGxvY2k9Ym90NzUucGRjLCBsYWJlbHM9YygiTW9jayIsIlBEQyIpKSlbLDY6N10pCmRmNCA8LSBkYXRhLmZyYW1lKHNldD0iUmFuZG9tIiwgYXMuZGF0YS5mcmFtZShid19sb2NpKGJ3ZmlsZXMgPSBnZW9fQ25SX2JpZ3dpZ3NbMzo0XSwgbG9jaT0iLi4vZGF0YS9wZWFrcy9Db250cm9sX3BlYWtzX3NodWZmbGVkLmJlZCIsIGxhYmVscz1jKCJNb2NrIiwiUERDIikpKVssNjo3XSkKZGYgPC0gcmJpbmQoZGYxLGRmMixkZjMsZGY0KQpkZiRsZmMucGRjIDwtIGxvZzIoZGYkUERDL2RmJE1vY2spCmRmJGRpZmYucGRjIDwtIGRmJFBEQyAtIGRmJE1vY2sKbWRmIDwtIG1lbHQoZGYpCm1kZiRsZzIgPC0gbG9nMihtZGYkdmFsdWUpCmdndmlvbGluKG1kZlttZGYkdmFyaWFibGUgJWluJSBjKCJNb2NrIiwiUERDIiksXSwgInNldCIsImxnMiIsZmlsbD0idmFyaWFibGUiLHBhbGV0dGUgPSBteXBhbCwgYWRkPSJtZWRpYW5faXFyIikKYGBgCgoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9M30KZ2d2aW9saW4obWRmW21kZiR2YXJpYWJsZSAlaW4lICJsZmMucGRjIixdLCAic2V0IiwidmFsdWUiLGZpbGw9InZhcmlhYmxlIixwYWxldHRlID0gbXlwYWwsIGFkZD0ibWVkaWFuX2lxciIpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKYGBgCgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbihtZGZbbWRmJHZhcmlhYmxlICVpbiUgImRpZmYucGRjIixdLCAic2V0IiwidmFsdWUiLGZpbGw9InZhcmlhYmxlIixwYWxldHRlID0gbXlwYWwsIGFkZD0ibWVkaWFuX2lxciIpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yMCwyMCkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQp0b3AyNS5wZHMuQ1RDRl9HNCA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1socmVzdWx0cyRwZHMucXVhbnRpbGU9PTQgJiByZXN1bHRzJGNsYXNzID09ICJDVENGX2FuZF9HNCIpLDE6M10sbmEucm09VCkKdG9wMjUucGRzLkNUQ0Zfb25seSA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUocmVzdWx0c1socmVzdWx0cyRwZHMucXVhbnRpbGU9PTQgICYgIHJlc3VsdHMkY2xhc3MgPT0gIkNUQ0Zfbm90X0c0IiksMTozXSxuYS5ybT1UKQoKcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBHNF9iaWd3aWdzLCBsb2NpID0gdG9wMjUucGRzLkNUQ0ZfRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbM10pICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBHNF9iaWd3aWdzLCBsb2NpID0gdG9wMjUucGRzLkNUQ0Zfb25seSwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFszXSkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTApKQpnZ2FycmFuZ2UocDEscDIsIG5jb2w9MikKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEc0X2JpZ3dpZ3MsIGxvY2kgPSB0b3AyNS5wZGMuQ1RDRl9HNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFszXSkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTApKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEc0X2JpZ3dpZ3MsIGxvY2kgPSB0b3AyNS5wZGMuQ1RDRl9vbmx5LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsWzNdKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxMCkpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpgYGAKCmBgYHtyIFBEUyBsb3dlciBxdWFudGlsZSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30Kb3JkLnRvcDI1IDwtIG9yZGVyKHJvd01lYW5zKGFzLmRhdGEuZnJhbWUoYndfaGVhdG1hcChid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMV0sbG9jaSA9IHRvcDI1LnBkcywgbW9kZSA9ICJjZW50ZXIiKSkpKQpwMSA8LSBwbG90X2J3X2hlYXRtYXAoYndmaWxlcyA9IGdlb19iaWd3aWdzWzFdLGxvY2kgPSB0b3AyNS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgem1heCA9IDEwLCBtYXhfcm93c19hbGxvd2VkID0gNTAsIG9yZGVyX2J5ID0gb3JkLnRvcDI1KQpwMiA8LSBwbG90X2J3X2hlYXRtYXAoYndmaWxlcyA9IGdlb19iaWd3aWdzWzJdLGxvY2kgPSB0b3AyNS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgem1heCA9IDEwLCBtYXhfcm93c19hbGxvd2VkID0gNTAsIG9yZGVyX2J5ID0gb3JkLnRvcDI1KQpnZ2FycmFuZ2UocDEscDIsIG5jb2w9MiwgY29tbW9uLmxlZ2VuZCA9IFQpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9SGVhdG1hcF9DVENGX3RvcDI1X1BEU3F1YW50aWxlLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKYGBge3IgUGhlbkRDIHRvcCAyNSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KCm9yZC50b3AyNSA8LSBvcmRlcihyb3dNZWFucyhhcy5kYXRhLmZyYW1lKGJ3X2hlYXRtYXAoYndmaWxlcyA9IGdlb19iaWd3aWdzWzNdLGxvY2kgPSB0b3AyNS5wZHMsIG1vZGUgPSAiY2VudGVyIikpKSkKcDEgPC0gcGxvdF9id19oZWF0bWFwKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1sxXSxsb2NpID0gdG9wMjUucGRzLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIHptYXggPSAxMCwgbWF4X3Jvd3NfYWxsb3dlZCA9IDUwLCBvcmRlcl9ieSA9IG9yZC50b3AyNSkKcDIgPC0gcGxvdF9id19oZWF0bWFwKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1szXSxsb2NpID0gdG9wMjUucGRzLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIHptYXggPSAxMCwgbWF4X3Jvd3NfYWxsb3dlZCA9IDUwLCBvcmRlcl9ieSA9IG9yZC50b3AyNSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIsIGNvbW1vbi5sZWdlbmQgPSBUKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfUhlYXRtYXBfQ1RDRl90b3AyNV9QaGVuREMzX29uX1BEU19xdWFudGlsZS5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCmBgYAoKYGBge3IgUERTIGJvdHRvbSA3NSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9M30Kb3JkLmJvdDc1IDwtIG9yZGVyKHJvd01lYW5zKGFzLmRhdGEuZnJhbWUoYndfaGVhdG1hcChid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMV0sbG9jaSA9IGJvdDc1LnBkcywgbW9kZSA9ICJjZW50ZXIiKSkpKQpwMSA8LSBwbG90X2J3X2hlYXRtYXAoYndmaWxlcyA9IGdlb19iaWd3aWdzWzFdLGxvY2kgPSBib3Q3NS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgem1heCA9IDEwLCBtYXhfcm93c19hbGxvd2VkID0gMjAwLCBvcmRlcl9ieSA9IG9yZC5ib3Q3NSkKcDIgPC0gcGxvdF9id19oZWF0bWFwKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1syXSxsb2NpID0gYm90NzUucGRzLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIHptYXggPSAxMCwgbWF4X3Jvd3NfYWxsb3dlZCA9IDIwMCwgb3JkZXJfYnkgPSBvcmQuYm90NzUpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yLCBjb21tb24ubGVnZW5kID0gVCkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1IZWF0bWFwX0NUQ0ZfYm90NzVfUERTcXVhbnRpbGUucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYApgYGB7ciBQaGVuREMzIGJvdHRvbSA3NSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9M30Kb3JkLmJvdDc1IDwtIG9yZGVyKHJvd01lYW5zKGFzLmRhdGEuZnJhbWUoYndfaGVhdG1hcChid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMV0sbG9jaSA9IGJvdDc1LnBkcywgbW9kZSA9ICJjZW50ZXIiKSkpKQpwMSA8LSBwbG90X2J3X2hlYXRtYXAoYndmaWxlcyA9IGdlb19iaWd3aWdzWzFdLGxvY2kgPSBib3Q3NS5wZHMsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgem1heCA9IDEwLCBtYXhfcm93c19hbGxvd2VkID0gMjAwLCBvcmRlcl9ieSA9IG9yZC5ib3Q3NSkKcDIgPC0gcGxvdF9id19oZWF0bWFwKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1szXSxsb2NpID0gYm90NzUucGRzLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIHptYXggPSAxMCwgbWF4X3Jvd3NfYWxsb3dlZCA9IDIwMCwgb3JkZXJfYnkgPSBvcmQuYm90NzUpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yLCBjb21tb24ubGVnZW5kID0gVCkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1IZWF0bWFwX0NUQ0ZfYm90NzVfUGhlbkRDM19vbl9QRFNfcXVhbnRpbGUucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCgpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Ckc0X0NuUiA8LSBid19sb2NpKAogIGMoCiAgICAiLi4vbWVuZGVsZXkvRmlndXJlUzIvRzRfQ1VULVJ1bl9Nb2NrLVBEU19DUE1fV3VsZnJpZGdlLmJ3IiwKICAgICIuLi9tZW5kZWxleS9GaWd1cmVTMi9HNF9DVVQtUnVuX1BEU19DUE1fV3VsZnJpZGdlLmJ3IgogICksCiAgbG9jaSA9IG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZShyZXN1bHRzLCBuYS5ybSA9IFQpLAogIGxhYmVscyA9IGMoIk1vY2siLCAiUERTIikKKQpyZXN1bHRzJEc0X0NuUl9kZWx0YSA8LSBHNF9DblIkUERTIC0gRzRfQ25SJE1vY2sKcmVzdWx0cyRHNF9DblJfbGZjIDwtIGxvZzIoRzRfQ25SJFBEUyAvIEc0X0NuUiRNb2NrKQpyZXN1bHRzJEc0X0NuUl9tb2NrIDwtIEc0X0NuUiRNb2NrCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9Mn0KZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gInBkcy5xdWFudGlsZSIsCiAgeSA9ICJHNF9DblJfZGVsdGEiLAogIGZpbGwgPSBteXBhbFsyXSwKICBhZGQgPSAibWVkaWFuX2lxciIKKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMTAsIDE1KSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLjU1LCBsaW5ldHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG90dGVkIikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fRzRfQ25SX2RlbHRhX2J5X1BEU3F1YW50aWxlLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9Mn0KZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gInBkcy5xdWFudGlsZSIsCiAgeSA9ICJHNF9DblJfbGZjIiwKICBmaWxsID0gbXlwYWxbMl0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEwLCAxNSkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdHRlZCIpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9VmlvbGluX0c0X0NuUl9kZWx0YV9ieV9QRFNxdWFudGlsZS5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhHNF9DblJfbGZjIH4gcGRzLnF1YW50aWxlLCByZXN1bHRzKQpgYGAKYGBge3J9CnJlc3VsdHMkcGRzLnF1YXJ0aWxlLnRvcDI1IDwtIHJlc3VsdHMkcGRzLnF1YW50aWxlID09IDQKbWVhbihuYS5vbWl0KHJlc3VsdHMkRzRfQ25SX2RlbHRhKSkKbWVhbihyZXN1bHRzJEc0X0NuUl9kZWx0YVtyZXN1bHRzJHBkcy5xdWFydGlsZS50b3AyNV0pCm1lYW4ocmVzdWx0cyRHNF9DblJfZGVsdGFbIXJlc3VsdHMkcGRzLnF1YXJ0aWxlLnRvcDI1XSkKY29tcGFyZV9tZWFucyhHNF9DblJfZGVsdGEgfiBwZHMucXVhcnRpbGUudG9wMjUsIHJlc3VsdHMpCmBgYAoKCmBgYHtyfQpleHBvcnQuYmVkKHRvcDI1LnBkcywiLi4vZGF0YS9wZWFrcy9DVENGX3BlYWtzX3RvcDI1X3Bkc191cC5iZWQiKQpleHBvcnQuYmVkKGJvdDc1LnBkcywiLi4vZGF0YS9wZWFrcy9DVENGX3BlYWtzX2JvdDc1X3Bkc191cC5iZWQiKQpgYGAKCmBgYHtyfQp0b3AyNS5wZHMgPC0gcnRyYWNrbGF5ZXI6OmltcG9ydCgiLi4vZGF0YS9wZWFrcy9DVENGX3BlYWtzX3RvcDI1X3Bkc191cC5iZWQiKQpib3Q3NS5wZHMgPC0gcnRyYWNrbGF5ZXI6OmltcG9ydCgiLi4vZGF0YS9wZWFrcy9DVENGX3BlYWtzX2JvdDc1X3Bkc191cC5iZWQiKQpgYGAKCiMjIyBBbmFseXNpcyBieSBHNCBtb3RpZgoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KcnguRzQgPC0gcnRyYWNrbGF5ZXI6OmltcG9ydCgiLi4vZGF0YS9wZWFrcy9tbTEwX2Nhbm9uaWNhbF9HNF9QUVMtcmVnZXguYmVkIikgIAp0ci5HNCA8LSBydHJhY2tsYXllcjo6aW1wb3J0KCIuLi9kYXRhL3BlYWtzL0c0SF9tbTEwXzEuNzUuYmVkIikgIApHNF9iZWQgPC0gcnRyYWNrbGF5ZXI6OmltcG9ydCgnLi4vZGF0YS9wZWFrcy9HNF9XVF9wZWFrcy5uYXJyb3dQZWFrJykKYmVkc2NvdXQ6OnBsb3RfZXVsZXIobGlzdChyeC5HNCx0ci5HNCksbmFtZXM9YygiUmVnZXgiLCJHNEh1bnRlciIpKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZlbm5fUmVnZXhfRzRIdW50ZXIucGRmIiksbGFzdF9wbG90KCkpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQpiZWRzY291dDo6cGxvdF9ldWxlcihsaXN0KHJ4Lkc0LHRyLkc0LEc0X2JlZCksbmFtZXM9YygiUmVnZXgiLCJHNEh1bnRlciIsIkc0IikpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9VmVubl9SZWdleF9HNEh1bnRlcl9HNENuVC5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KdHIuRzQkbmFtZSA8LSAiRzQiCnRvcDI1LnBkcy5HNGFubm8gPC0gYmVkc2NvdXQ6OmFubm90YXRlX25lYXJieV9mZWF0dXJlcyh0b3AyNS5wZHMsdHIuRzQsbmFtZV9maWVsZCA9ICJuYW1lIiwgZGlzdGFuY2VfY3V0b2ZmID0gMTAwMCkKdG9wMjUucGRzLkc0XzFrYiA8LSB0b3AyNS5wZHMuRzRhbm5vWyFpcy5uYSh0b3AyNS5wZHMuRzRhbm5vJG5lYXJieV9mZWF0dXJlcyksXSAgICAgICAgICAgICAgCnRvcDI1LnBkcy5ub0c0IDwtIHRvcDI1LnBkcy5HNGFubm9baXMubmEodG9wMjUucGRzLkc0YW5ubyRuZWFyYnlfZmVhdHVyZXMpLF0gICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lncywgbG9jaSA9IHRvcDI1LnBkcy5HNF8xa2IsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lncywgbG9jaSA9IHRvcDI1LnBkcy5ub0c0LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxMCkpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpgYGAKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1sxOjJdLGxvY2kgPSB0b3AyNS5wZHMuRzRfMWtiLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsW2MoMSwyKV0pICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKcDIgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1sxOjJdLGxvY2kgPSB0b3AyNS5wZHMubm9HNCwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFtjKDEsMildKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxMCkpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVByb2ZpbGVfQ1RDRl90b3AyNV9QRFNxdWFudGlsZV9ieUc0b3ZlcmxhcC5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfSAKcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1syXSxiZ19id2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMV0sIGxvY2kgPSB0b3AyNS5wZHMuRzRfMWtiLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsWzJdLG5vcm1fbW9kZSA9ICJsb2cyZmMiLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTEsMSkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMl0sYmdfYndmaWxlcyA9IGdlb19iaWd3aWdzWzFdLCBsb2NpID0gdG9wMjUucGRzLm5vRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbMl0sbm9ybV9tb2RlID0gImxvZzJmYyIsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMSwxKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9UHJvZmlsZV9DVENGZm9sZGNoYW5nZV90b3AyNV9QRFNxdWFudGlsZV9ieUc0bW90aWYxa2IucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG9wMjUucGRjLkc0YW5ubyA8LSBiZWRzY291dDo6YW5ub3RhdGVfbmVhcmJ5X2ZlYXR1cmVzKHRvcDI1LnBkYyx0ci5HNCxuYW1lX2ZpZWxkID0gIm5hbWUiLCBkaXN0YW5jZV9jdXRvZmYgPSAxMDAwKQp0b3AyNS5wZGMuRzRfMWtiIDwtIHRvcDI1LnBkcy5HNGFubm9bIWlzLm5hKHRvcDI1LnBkcy5HNGFubm8kbmVhcmJ5X2ZlYXR1cmVzKSxdICAgICAgICAgICAgICAKdG9wMjUucGRjLm5vRzQgPC0gdG9wMjUucGRzLkc0YW5ub1tpcy5uYSh0b3AyNS5wZHMuRzRhbm5vJG5lYXJieV9mZWF0dXJlcyksXSAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLCBsb2NpID0gdG9wMjUucGRjLkc0XzFrYiwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTApKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLCBsb2NpID0gdG9wMjUucGRjLm5vRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBnZW9fYmlnd2lnc1szXSxiZ19id2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbMV0sIGxvY2kgPSB0b3AyNS5wZGMuRzRfMWtiLCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsWzNdLG5vcm1fbW9kZSA9ICJsb2cyZmMiLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTEsMSkpCnAyIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbM10sYmdfYndmaWxlcyA9IGdlb19iaWd3aWdzWzFdLCBsb2NpID0gdG9wMjUucGRjLm5vRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbM10sbm9ybV9tb2RlID0gImxvZzJmYyIsc2hvd19lcnJvciA9IFQpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMSwxKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmdnc2F2ZShnbHVlKCJ7cGxvdF9mb2xkZXJ9UHJvZmlsZV9DVENGZm9sZGNoYW5nZV90b3AyNV9QaGVuREMzcXVhbnRpbGVfYnlHNG1vdGlmMWtiLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQp0ci5HNCA8LSBydHJhY2tsYXllcjo6aW1wb3J0KCIuLi9kYXRhL3BlYWtzL0c0SF9tbTEwXzEuNzUuYmVkIikgIAp0ci5HNCRuYW1lIDwtICJHNCIKdG9wMjUucGRjLkc0YW5ubyA8LSBiZWRzY291dDo6YW5ub3RhdGVfbmVhcmJ5X2ZlYXR1cmVzKHRvcDI1LnBkYyx0ci5HNCxuYW1lX2ZpZWxkID0gIm5hbWUiLCBkaXN0YW5jZV9jdXRvZmYgPSAxMDAwKQp0b3AyNS5wZGMuRzRfMWtiIDwtIHRvcDI1LnBkYy5HNGFubm9bIWlzLm5hKHRvcDI1LnBkYy5HNGFubm8kbmVhcmJ5X2ZlYXR1cmVzKSxdICAgICAgICAgICAgICAKdG9wMjUucGRjLm5vRzQgPC0gdG9wMjUucGRjLkc0YW5ub1tpcy5uYSh0b3AyNS5wZGMuRzRhbm5vJG5lYXJieV9mZWF0dXJlcyksXSAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLCBsb2NpID0gdG9wMjUucGRjLkc0XzFrYiwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTApKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzLCBsb2NpID0gdG9wMjUucGRjLm5vRzQsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWwpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzW2MoMSwzKV0sbG9jaSA9IHRvcDI1LnBkYy5HNF8xa2IsIG1vZGUgPSAiY2VudGVyIix2ZXJib3NlID0gRiwgY29sb3JzID0gbXlwYWxbYygxLDMpXSkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTApKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzW2MoMSwzKV0sbG9jaSA9IHRvcDI1LnBkYy5ub0c0LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsW2MoMSwzKV0pICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDEwKSkKZ2dhcnJhbmdlKHAxLHAyLCBuY29sPTIpCmBgYAoKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnAxIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gZ2VvX2JpZ3dpZ3NbM10sYmdfYndmaWxlcyA9IGdlb19iaWd3aWdzWzFdLCBsb2NpID0gdG9wMjUucGRzLkc0XzFrYiwgbW9kZSA9ICJjZW50ZXIiLHZlcmJvc2UgPSBGLCBjb2xvcnMgPSBteXBhbFszXSxub3JtX21vZGUgPSAibG9nMmZjIixzaG93X2Vycm9yID0gVCkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0xLDEpKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IGdlb19iaWd3aWdzWzNdLGJnX2J3ZmlsZXMgPSBnZW9fYmlnd2lnc1sxXSwgbG9jaSA9IHRvcDI1LnBkcy5ub0c0LCBtb2RlID0gImNlbnRlciIsdmVyYm9zZSA9IEYsIGNvbG9ycyA9IG15cGFsWzNdLG5vcm1fbW9kZSA9ICJsb2cyZmMiLHNob3dfZXJyb3IgPSBUKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTEsMSkpCmdnYXJyYW5nZShwMSxwMiwgbmNvbD0yKQpgYGAKCiMjIyBBbmFseXNpcyBieSBHNCBxdWFudGlsZQpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAiRzQucXVhbnRpbGUiLAogIHkgPSAiZGVzZXEubGZjLnBkcyIsCiAgZmlsbCA9IG15cGFsWzFdLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG90dGVkIikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9sZmNfYnlfRzRxdWFudGlsZS5wZGYiKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CmdndmlvbGluKAogIHJlc3VsdHMsCiAgeCA9ICJHNC5xdWFudGlsZSIsCiAgeSA9ICJsb2cyLkc0IiwKICBmaWxsID0gbXlwYWwyWzVdLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fRzRfYnlfRzRxdWFudGlsZS5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CnBlYWtfY2F0cyA8LSBiZWRzY291dDo6aW1wb3J0X25hbWVkX2JlZF9pbnRvX2xpc3QocGVha3NfYmVkKQpwbG90X2J3X3Byb2ZpbGUoCiAgRzRfYmlnd2lncywKICBwZWFrX2NhdHMsCiAgbGFiZWxzID0gYygKICAgIHBlYWtfY2F0c1tbMV1dWzEsIF0kbmFtZSwKICAgIHBlYWtfY2F0c1tbMl1dWzEsIF0kbmFtZSwKICAgIHBlYWtfY2F0c1tbM11dWzEsIF0kbmFtZSwKICAgIHBlYWtfY2F0c1tbNF1dWzEsIF0kbmFtZQogICksCiAgbW9kZSA9ICJjZW50ZXIiLAogIHNob3dfZXJyb3IgPSBULAogIHZlcmJvc2UgPSBGLAogIHJlbW92ZV90b3AgPSAwLjAwMSwKICBjb2xvcnMgPSBteXBhbAopCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KcGxvdF9id19wcm9maWxlKAogIGNvbWJpbmVkX2JpZ3dpZ3NbMV0sCiAgcGVha19jYXRzLAogIGxhYmVscyA9IGMoCiAgICBwZWFrX2NhdHNbWzFdXVsxLCBdJG5hbWUsCiAgICBwZWFrX2NhdHNbWzJdXVsxLCBdJG5hbWUsCiAgICBwZWFrX2NhdHNbWzNdXVsxLCBdJG5hbWUsCiAgICBwZWFrX2NhdHNbWzRdXVsxLCBdJG5hbWUKICApLAogIG1vZGUgPSAiY2VudGVyIiwKICBzaG93X2Vycm9yID0gVCwKICB2ZXJib3NlID0gRiwKICByZW1vdmVfdG9wID0gMC4wMDEsCiAgY29sb3JzID0gbXlwYWwKKQpgYGAKCgoKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0zfQpwMSA8LSBwbG90X2J3X3Byb2ZpbGUoCiAgYyhtb2Nrc19iaWd3aWdzLCBwZHNfYmlnd2lncyksCiAgcGVha19jYXRzW1sxXV0sCiAgbGFiZWxzID0gYygibW9jazEiLCAibW9jazIiLCAidHJ0MSIsICJydHIyIiksCiAgbW9kZSA9ICJjZW50ZXIiLAogIHNob3dfZXJyb3IgPSBULAogIHZlcmJvc2UgPSBGLAogIHJlbW92ZV90b3AgPSAwLjAwMSwKICBjb2xvcnMgPSBteXBhbDJbYyg5LCAxMCwgNSwgNildLAogIHVwc3RyZWFtID0gMTUwMCwKICBkb3duc3RyZWFtID0gMTUwMAopCnAyIDwtIHBsb3RfYndfcHJvZmlsZSgKICBjKG1vY2tzX2JpZ3dpZ3MsIHBkc19iaWd3aWdzKSwKICBwZWFrX2NhdHNbWzJdXSwKICBsYWJlbHMgPSBjKCJtb2NrMSIsICJtb2NrMiIsICJ0cnQxIiwgInJ0cjIiKSwKICBtb2RlID0gImNlbnRlciIsCiAgc2hvd19lcnJvciA9IFQsCiAgdmVyYm9zZSA9IEYsCiAgcmVtb3ZlX3RvcCA9IDAuMDAxLAogIGNvbG9ycyA9IG15cGFsMltjKDksIDEwLCA1LCA2KV0sCiAgdXBzdHJlYW0gPSAxNTAwLAogIGRvd25zdHJlYW0gPSAxNTAwCikKcDMgPC0gcGxvdF9id19wcm9maWxlKAogIGMobW9ja3NfYmlnd2lncywgcGRzX2JpZ3dpZ3MpLAogIHBlYWtfY2F0c1tbM11dLAogIGxhYmVscyA9IGMoIm1vY2sxIiwgIm1vY2syIiwgInRydDEiLCAicnRyMiIpLAogIG1vZGUgPSAiY2VudGVyIiwKICBzaG93X2Vycm9yID0gVCwKICB2ZXJib3NlID0gRiwKICByZW1vdmVfdG9wID0gMC4wMDEsCiAgY29sb3JzID0gbXlwYWwyW2MoOSwgMTAsIDUsIDYpXSwKICB1cHN0cmVhbSA9IDE1MDAsCiAgZG93bnN0cmVhbSA9IDE1MDAKKQpwNCA8LSBwbG90X2J3X3Byb2ZpbGUoCiAgYyhtb2Nrc19iaWd3aWdzLCBwZHNfYmlnd2lncyksCiAgcGVha19jYXRzW1s0XV0sCiAgbGFiZWxzID0gYygibW9jazEiLCAibW9jazIiLCAidHJ0MSIsICJydHIyIiksCiAgbW9kZSA9ICJjZW50ZXIiLAogIHNob3dfZXJyb3IgPSBULAogIHZlcmJvc2UgPSBGLAogIHJlbW92ZV90b3AgPSAwLjAwMSwKICBjb2xvcnMgPSBteXBhbDJbYyg5LCAxMCwgNSwgNildLAogIHVwc3RyZWFtID0gMTUwMCwKICBkb3duc3RyZWFtID0gMTUwMAopCgpnZ2FycmFuZ2UocDEsIHAyLCBwMywgcDQsIG5jb2wgPSA0LCBucm93ID0gMSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9M30KcDEgPC0gcGxvdF9id19wcm9maWxlKAogIGMobW9ja3NfYmlnd2lncywgcGRzX2JpZ3dpZ3MpLAogIHBlYWtfY2F0c1tbMV1dLAogIGxhYmVscyA9IGMoIm1vY2sxIiwgIm1vY2syIiwgInRydDEiLCAicnRyMiIpLAogIG1vZGUgPSAiY2VudGVyIiwKICBzaG93X2Vycm9yID0gVCwKICB2ZXJib3NlID0gRiwKICByZW1vdmVfdG9wID0gMC4wMDEsCiAgY29sb3JzID0gbXlwYWwyW2MoOSwgMTAsIDMsIDQpXSwKICB1cHN0cmVhbSA9IDE1MDAsCiAgZG93bnN0cmVhbSA9IDE1MDAKKQpwMiA8LSBwbG90X2J3X3Byb2ZpbGUoCiAgYyhtb2Nrc19iaWd3aWdzLCBwZHNfYmlnd2lncyksCiAgcGVha19jYXRzW1syXV0sCiAgbGFiZWxzID0gYygibW9jazEiLCAibW9jazIiLCAidHJ0MSIsICJydHIyIiksCiAgbW9kZSA9ICJjZW50ZXIiLAogIHNob3dfZXJyb3IgPSBULAogIHZlcmJvc2UgPSBGLAogIHJlbW92ZV90b3AgPSAwLjAwMSwKICBjb2xvcnMgPSBteXBhbDJbYyg5LCAxMCwgMywgNCldLAogIHVwc3RyZWFtID0gMTUwMCwKICBkb3duc3RyZWFtID0gMTUwMAopCnAzIDwtIHBsb3RfYndfcHJvZmlsZSgKICBjKG1vY2tzX2JpZ3dpZ3MsIHBkc19iaWd3aWdzKSwKICBwZWFrX2NhdHNbWzNdXSwKICBsYWJlbHMgPSBjKCJtb2NrMSIsICJtb2NrMiIsICJ0cnQxIiwgInJ0cjIiKSwKICBtb2RlID0gImNlbnRlciIsCiAgc2hvd19lcnJvciA9IFQsCiAgdmVyYm9zZSA9IEYsCiAgcmVtb3ZlX3RvcCA9IDAuMDAxLAogIGNvbG9ycyA9IG15cGFsMltjKDksIDEwLCAzLCA0KV0sCiAgdXBzdHJlYW0gPSAxNTAwLAogIGRvd25zdHJlYW0gPSAxNTAwCikKcDQgPC0gcGxvdF9id19wcm9maWxlKAogIGMobW9ja3NfYmlnd2lncywgcGRzX2JpZ3dpZ3MpLAogIHBlYWtfY2F0c1tbNF1dLAogIGxhYmVscyA9IGMoIm1vY2sxIiwgIm1vY2syIiwgInRydDEiLCAicnRyMiIpLAogIG1vZGUgPSAiY2VudGVyIiwKICBzaG93X2Vycm9yID0gVCwKICB2ZXJib3NlID0gRiwKICByZW1vdmVfdG9wID0gMC4wMDEsCiAgY29sb3JzID0gbXlwYWwyW2MoOSwgMTAsIDMsIDQpXSwKICB1cHN0cmVhbSA9IDE1MDAsCiAgZG93bnN0cmVhbSA9IDE1MDAKKQoKZ2dhcnJhbmdlKHAxLCBwMiwgcDMsIHA0LCBuY29sID0gNCwgbnJvdyA9IDEpCmBgYAojIyMgY2VuIHdlIGxlYXJuIHNvbWV0aGluZyBmcm9tIHRoZSBnZW5lcyB3aXRoIHRvcC1tb3N0IGluY3JlYXNlIGluIENUQ0Y/CmBgYHtyfQpzaWd1cC5wZHMgPC0gcmVzdWx0c1tyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkcywgXQpzaWd1cC5wZGMgPC0gcmVzdWx0c1tyZXN1bHRzJGRlc2VxLnNpZ3VwLnBkYywgXQoKI2V4cG9ydC5iZWQoc2lndXAucGRzLCJwZWFrc19zaWd1cF9wZHMuYmVkIikKI2V4cG9ydC5iZWQoc2lndXAucGRzLCJwZWFrc19zaWd1cF9wZHMuYmVkIikKYGBgCgoKYGBge3J9CmdnaGlzdG9ncmFtKHJlc3VsdHMsICJ3aWR0aCIsIGFkZCA9ICJtZWRpYW4iLCBmaWxsID0gImNsYXNzIikKYGBgCgojIyMgRGlzdGFuY2UtYmFzZWQgYW5hbHlzaXMKCmBgYHtyfQpHNF9iZWQgPC0gaW1wb3J0KCcuLi9kYXRhL3BlYWtzL0c0X1dUX3BlYWtzLm5hcnJvd1BlYWsnKQpBVEFDX2JlZCA8LSBpbXBvcnQoJy4uL2RhdGEvcGVha3MvQVRBQ19zZXFfbUVTQ19NYXJ0aXJlX3BlYWtzLm5hcnJvd1BlYWsnKQpwcm9fYmVkIDwtIGltcG9ydCgnLi4vZGF0YS9wZWFrcy9yZWdpb25zL3Byb21vdGVyc19nZW5lU3ltYm9sLm1tMTAuYmVkJykKCgpHNF9iZWQgPC0gYmVkc2NvdXQ6OmFubm90YXRlX292ZXJsYXBwaW5nX2ZlYXR1cmVzKEc0X2JlZCwgcHJvX2JlZCwgbmFtZV9maWVsZCA9ICJuYW1lIikKCkc0X2JlZCRuYW1lIDwtICJHNCIKRzRfYmVkJG5hbWVbIWlzLm5hKEc0X2JlZCRuZWFyYnlfZmVhdHVyZXMpXSA8LSAiRzRwcm8iCkc0X2JlZCRuYW1lW2dyZXBsKCJwcm8iLCBHNF9iZWQkbmFtZSldIDwtICJHNHBybyIKYGBgCgpgYGB7cn0KbmVhcmVzdF9HNF8xa2IgPC0gYmVkc2NvdXQ6OmFubm90YXRlX25lYXJieV9mZWF0dXJlcygKICBjdGNmLAogIEc0X2JlZCwKICBkaXN0YW5jZV9jdXRvZmYgPSAxMDAwLAogIGlnbm9yZS5zdHJhbmQgPSBULAogIG5hbWVfZmllbGQgPSAibmFtZSIKKQpuZWFyZXN0X0c0XzIuNWtiIDwtIGJlZHNjb3V0Ojphbm5vdGF0ZV9uZWFyYnlfZmVhdHVyZXMoCiAgY3RjZiwKICBHNF9iZWQsCiAgZGlzdGFuY2VfY3V0b2ZmID0gMjUwMCwKICBpZ25vcmUuc3RyYW5kID0gVCwKICBuYW1lX2ZpZWxkID0gIm5hbWUiCikKbmVhcmVzdF9HNF81a2IgPC0gYmVkc2NvdXQ6OmFubm90YXRlX25lYXJieV9mZWF0dXJlcygKICBjdGNmLAogIEc0X2JlZCwKICBkaXN0YW5jZV9jdXRvZmYgPSA1MDAwLAogIGlnbm9yZS5zdHJhbmQgPSBULAogIG5hbWVfZmllbGQgPSAibmFtZSIKKQpuZWFyZXN0X0c0XzEwa2IgPC0gYmVkc2NvdXQ6OmFubm90YXRlX25lYXJieV9mZWF0dXJlcygKICBjdGNmLAogIEc0X2JlZCwKICBkaXN0YW5jZV9jdXRvZmYgPSAxMDAwMCwKICBpZ25vcmUuc3RyYW5kID0gVCwKICBuYW1lX2ZpZWxkID0gIm5hbWUiCikKbmVhcmVzdF9HNF81MGtiIDwtIGJlZHNjb3V0Ojphbm5vdGF0ZV9uZWFyYnlfZmVhdHVyZXMoCiAgY3RjZiwKICBHNF9iZWQsCiAgZGlzdGFuY2VfY3V0b2ZmID0gNTAwMDAsCiAgaWdub3JlLnN0cmFuZCA9IFQsCiAgbmFtZV9maWVsZCA9ICJuYW1lIgopCgpjdGNmJG5lYXJlc3RfRzQgPC0gZmFjdG9yKCI+NTBrYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiPDFrYiIsICI8Mi41a2IiLCAiPDVrYiIsICI8MTBrYiIsICI8NTBrYiIsICI+NTBrYiIpKQpjdGNmJG5lYXJlc3RfRzRbIWlzLm5hKG5lYXJlc3RfRzRfNTBrYiRuZWFyYnlfZmVhdHVyZXMpXSA8LSAiPDUwa2IiCmN0Y2YkbmVhcmVzdF9HNFshaXMubmEobmVhcmVzdF9HNF8xMGtiJG5lYXJieV9mZWF0dXJlcyldIDwtICI8MTBrYiIKY3RjZiRuZWFyZXN0X0c0WyFpcy5uYShuZWFyZXN0X0c0XzVrYiRuZWFyYnlfZmVhdHVyZXMpXSA8LSAiPDVrYiIKY3RjZiRuZWFyZXN0X0c0WyFpcy5uYShuZWFyZXN0X0c0XzIuNWtiJG5lYXJieV9mZWF0dXJlcyldIDwtICI8Mi41a2IiCmN0Y2YkbmVhcmVzdF9HNFshaXMubmEobmVhcmVzdF9HNF8xa2IkbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIjwxa2IiCgpjdGNmJG5lYXJlc3RfRzRfdHlwZSA8LSAibm9uZSIKY3RjZiRuZWFyZXN0X0c0X3R5cGVbIWlzLm5hKG5lYXJlc3RfRzRfNTBrYiRuZWFyYnlfZmVhdHVyZXMpXSA8LSBuZWFyZXN0X0c0XzUwa2IkbmVhcmJ5X2ZlYXR1cmVzWyFpcy5uYShuZWFyZXN0X0c0XzUwa2IkbmVhcmJ5X2ZlYXR1cmVzKV0KY3RjZiRuZWFyZXN0X0c0X3R5cGVbIWlzLm5hKG5lYXJlc3RfRzRfMTBrYiRuZWFyYnlfZmVhdHVyZXMpXSA8LSBuZWFyZXN0X0c0XzEwa2IkbmVhcmJ5X2ZlYXR1cmVzWyFpcy5uYShuZWFyZXN0X0c0XzEwa2IkbmVhcmJ5X2ZlYXR1cmVzKV0KY3RjZiRuZWFyZXN0X0c0X3R5cGVbIWlzLm5hKG5lYXJlc3RfRzRfNWtiJG5lYXJieV9mZWF0dXJlcyldIDwtIG5lYXJlc3RfRzRfNWtiJG5lYXJieV9mZWF0dXJlc1shaXMubmEobmVhcmVzdF9HNF81a2IkbmVhcmJ5X2ZlYXR1cmVzKV0KY3RjZiRuZWFyZXN0X0c0X3R5cGVbIWlzLm5hKG5lYXJlc3RfRzRfMi41a2IkbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gbmVhcmVzdF9HNF8yLjVrYiRuZWFyYnlfZmVhdHVyZXNbIWlzLm5hKG5lYXJlc3RfRzRfMi41a2IkbmVhcmJ5X2ZlYXR1cmVzKV0KY3RjZiRuZWFyZXN0X0c0X3R5cGVbIWlzLm5hKG5lYXJlc3RfRzRfMWtiJG5lYXJieV9mZWF0dXJlcyldIDwtIG5lYXJlc3RfRzRfMWtiJG5lYXJieV9mZWF0dXJlc1shaXMubmEobmVhcmVzdF9HNF8xa2IkbmVhcmJ5X2ZlYXR1cmVzKV0KCmN0Y2YkbmVhcmVzdF9HNF90eXBlW2dyZXAoInBybyIsIGN0Y2YkbmVhcmVzdF9HNF90eXBlKV0gPC0gIkc0cHJvIgoKcmVzdWx0cyRuZWFyZXN0X0c0IDwtIGN0Y2YkbmVhcmVzdF9HNApyZXN1bHRzJG5lYXJlc3RfRzRfdHlwZSA8LSBjdGNmJG5lYXJlc3RfRzRfdHlwZQp0YWJsZShyZXN1bHRzJG5lYXJlc3RfRzQpCnRhYmxlKHJlc3VsdHMkbmVhcmVzdF9HNF90eXBlKQp0YWJsZShyZXN1bHRzJG5lYXJlc3RfRzQsIHJlc3VsdHMkbmVhcmVzdF9HNF90eXBlKQpgYGAKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gIm5lYXJlc3RfRzQiLAogIHkgPSAibWVhbi5tb2NrIiwKICBmaWxsID0gbXlwYWxbMV0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTApKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsLnkgPSA4LAogICAgICAgICAgICAgICAgICAgICBsYWJlbC54ID0gMywKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX3NpZ25hbF9ieV9HNGRpc3RhbmNlLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CmdndmlvbGluKAogIHJlc3VsdHMsCiAgeCA9ICJuZWFyZXN0X0c0IiwKICB5ID0gImRlc2VxLmxmYy5wZHMiLAogIGZpbGwgPSBteXBhbFsxXSwKICBhZGQgPSAibWVkaWFuX2lxciIKKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtNCwgNCkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gMC4yKSArCiAgZ2VvbV9obGluZSgKICAgIHlpbnRlcmNlcHQgPSBtZWRpYW4ocmVzdWx0cyRkZXNlcS5sZmMucGRzW3Jlc3VsdHMkbmVhcmVzdF9HNCA9PSAiPDFrYiJdKSwKICAgIGxpbmV0eXBlID0gImRvdHRlZCIsCiAgICBsaW5ld2lkdGggPSAwLjIKICApICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwueSA9IDMsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnggPSAyLAogICAgICAgICAgICAgICAgICAgICBzaXplID0gMykKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9QRFNfbGZjX2J5X0c0ZGlzdGFuY2UucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYApgYGB7cn0KbmVhcmVzdF9HNF9zdGF0cyA9IGNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IG5lYXJlc3RfRzQsIHJlc3VsdHMpCm5lYXJlc3RfRzRfc3RhdHMKd3JpdGVfdHN2KG5lYXJlc3RfRzRfc3RhdHMsCiAgICAgICAgICBnbHVlKCJ7c3RhdF9vdXRwdXR9cGRzX0c0ZGlzdGFuY2VfcGxvdHMtc3RhdGlzdGljcy50c3YiKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAibmVhcmVzdF9HNCIsCiAgeSA9ICJkZXNlcS5sZmMucGRjIiwKICBmaWxsID0gbXlwYWxbMV0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDIpKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9IDAuMikgKyBnZW9tX2hsaW5lKAogIHlpbnRlcmNlcHQgPSBtZWFuKHJlc3VsdHMkZGVzZXEubGZjLnBkY1tyZXN1bHRzJG5lYXJlc3RfRzQgPT0gIjwxa2IiXSksCiAgbGluZXR5cGUgPSAiZG90dGVkIiwKICBsaW5ld2lkdGggPSAwLjIKKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX1BoZW5EQzNfbGZjX2J5X0c0ZGlzdGFuY2UucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KbmVhcmVzdF9HNF9zdGF0cyA9IGNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkYyB+IG5lYXJlc3RfRzQsIHJlc3VsdHMpCm5lYXJlc3RfRzRfc3RhdHMKd3JpdGVfdHN2KG5lYXJlc3RfRzRfc3RhdHMsIGdsdWUoIntzdGF0X291dHB1dH1waGVuZGNfRzRkaXN0YW5jZV9wbG90cy1zdGF0aXN0aWNzLnRzdiIpKQpgYGAKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9M30KZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gIm5lYXJlc3RfRzQiLAogIHkgPSAiZGVzZXEubGZjLnBkcyIsCiAgZmlsbCA9ICJuZWFyZXN0X0c0X3R5cGUiLAogIHBhbGV0dGUgPSBteXBhbFtjKDEsIDMsIDUpXSwKICBhZGQgPSAibWVkaWFuX2lxciIKKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMiwgNCkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gMC4yKSArIGdlb21faGxpbmUoCiAgeWludGVyY2VwdCA9IG1lYW4ocmVzdWx0cyRkZXNlcS5sZmMucGRzW3Jlc3VsdHMkbmVhcmVzdF9HNCA9PSAiPDFrYiJdKSwKICBsaW5ldHlwZSA9ICJkb3R0ZWQiLAogIGxpbmV3aWR0aCA9IDAuMgopICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGdyb3VwID0gbmVhcmVzdF9HNF90eXBlKSkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9QRFNfbGZjX2J5X0c0ZGlzdGFuY2VfcHJvLnBkZiIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKYGBge3J9CmNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IG5lYXJlc3RfRzQsIHJlc3VsdHNbcmVzdWx0cyRuZWFyZXN0X0c0X3R5cGUgPT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHNCIsIF0pCmNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IG5lYXJlc3RfRzQsIHJlc3VsdHNbcmVzdWx0cyRuZWFyZXN0X0c0X3R5cGUgPT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHNCIsIF0pICU+JQogIHdyaXRlX3RzdiguLAogICAgICAgICAgICBnbHVlKAogICAgICAgICAgICAgICJ7c3RhdF9vdXRwdXR9cGRzX0c0ZGlzdGFuY2VfcGxvdHMtbmVhcmVzdF9HNC1zdGF0aXN0aWNzLnRzdiIKICAgICAgICAgICAgKSkKYGBgCmBgYHtyfQpjb21wYXJlX21lYW5zKGRlc2VxLmxmYy5wZHMgfiBuZWFyZXN0X0c0LCByZXN1bHRzW3Jlc3VsdHMkbmVhcmVzdF9HNF90eXBlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRzRwcm8iLCBdKQpjb21wYXJlX21lYW5zKGRlc2VxLmxmYy5wZHMgfiBuZWFyZXN0X0c0LCByZXN1bHRzW3Jlc3VsdHMkbmVhcmVzdF9HNF90eXBlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRzRwcm8iLCBdKSAlPiUKICB3cml0ZV90c3YoLiwKICAgICAgICAgICAgZ2x1ZSgKICAgICAgICAgICAgICAie3N0YXRfb3V0cHV0fXBkc19HNGRpc3RhbmNlX3Bsb3RzLW5lYXJlc3RfRzRwcm8tc3RhdGlzdGljcy50c3YiCiAgICAgICAgICAgICkpCmBgYApgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAibmVhcmVzdF9HNCIsCiAgeSA9ICJkZXNlcS5sZmMucGRjIiwKICBmaWxsID0gIm5lYXJlc3RfRzRfdHlwZSIsCiAgcGFsZXR0ZSA9IG15cGFsW2MoMSwgMywgNSldLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yLCAyKSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSAwLjIpICsgZ2VvbV9obGluZSgKICB5aW50ZXJjZXB0ID0gbWVhbihyZXN1bHRzJGRlc2VxLmxmYy5wZGNbcmVzdWx0cyRuZWFyZXN0X0c0ID09ICI8MWtiIl0pLAogIGxpbmV0eXBlID0gImRvdHRlZCIsCiAgbGluZXdpZHRoID0gMC4yCikKZ2dzYXZlKGdsdWUoCiAgIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9QaGVuREMzX2xmY19ieV9HNGRpc3RhbmNlX3Byby5wZGYiCiksCnBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRjIH4gbmVhcmVzdF9HNCwgcmVzdWx0c1tyZXN1bHRzJG5lYXJlc3RfRzRfdHlwZSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkc0IiwgXSkKY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRjIH4gbmVhcmVzdF9HNCwgcmVzdWx0c1tyZXN1bHRzJG5lYXJlc3RfRzRfdHlwZSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkc0IiwgXSkgJT4lCiAgd3JpdGVfdHN2KC4sCiAgICAgICAgICAgIGdsdWUoCiAgICAgICAgICAgICAgIntzdGF0X291dHB1dH1waGVuZGNfRzRkaXN0YW5jZV9wbG90cy1uZWFyZXN0X0c0LXN0YXRpc3RpY3MudHN2IgogICAgICAgICAgICApKQpgYGAKCmBgYHtyfQpjb21wYXJlX21lYW5zKGRlc2VxLmxmYy5wZGMgfiBuZWFyZXN0X0c0LCByZXN1bHRzW3Jlc3VsdHMkbmVhcmVzdF9HNF90eXBlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRzRwcm8iLCBdKQpjb21wYXJlX21lYW5zKGRlc2VxLmxmYy5wZGMgfiBuZWFyZXN0X0c0LCByZXN1bHRzW3Jlc3VsdHMkbmVhcmVzdF9HNF90eXBlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRzRwcm8iLCBdKSAlPiUKICB3cml0ZV90c3YoLiwKICAgICAgICAgICAgZ2x1ZSgKICAgICAgICAgICAgICAie3N0YXRfb3V0cHV0fXBoZW5kY19HNGRpc3RhbmNlX3Bsb3RzLW5lYXJlc3RfRzRwcm8tc3RhdGlzdGljcy50c3YiCiAgICAgICAgICAgICkpCmBgYAojIyMgRGlzdGFuY2UtYmFzZWQgYW5hbHlzaXMsIHRoaXMgdGltZSB3aXRoIHByZWRpY3RlZCBHNCBtb3RpZnMsIG5vdCBleHBlcmltZW50YWwgcGVha3MKCmBgYHtyfQojcmVzdWx0cyA8LSByZWFkLnRhYmxlKGdsdWUoIntyZXN1bHRfZm9sZGVyfWZvbGRjaGFuZ2VfcmVzdWx0cy50eHQiKSkKcmVzdWx0cyRjbGFzcyA8LSBmYWN0b3IocmVzdWx0cyRjbGFzcywgbGV2ZWxzID0gYygiQ1RDRl9hbmRfRzQiLCAiQ1RDRl9ub3RfRzQiKSkKRzRfYmVkIDwtIGltcG9ydCgnLi4vZGF0YS9wZWFrcy9HNF9XVF9wZWFrcy5uYXJyb3dQZWFrJykKRzRfYmVkJG5hbWUgPC0gInBlYWsiCkc0cHJlZF9iZWQgPC0gaW1wb3J0KCcuLi9kYXRhL3BlYWtzL0c0SF9tbTEwXzEuNzUuYmVkJykKQVRBQ19iZWQgPC0gaW1wb3J0KCcuLi9kYXRhL3BlYWtzL0FUQUNfc2VxX21FU0NfTWFydGlyZV9wZWFrcy5uYXJyb3dQZWFrJykKcHJvX2JlZCA8LSBpbXBvcnQoJy4uL2RhdGEvcGVha3MvcmVnaW9ucy9wcm9tb3RlcnNfZ2VuZVN5bWJvbC5tbTEwLmJlZCcpCgpHNHByZWRfYmVkIDwtIGJlZHNjb3V0Ojphbm5vdGF0ZV9vdmVybGFwcGluZ19mZWF0dXJlcyhHNHByZWRfYmVkLCBHNF9iZWQsIG5hbWVfZmllbGQgPSAibmFtZSIpIAoKRzRwcmVkX2JlZCRuYW1lIDwtICJHNHByZWQiCkc0cHJlZF9iZWQkbmFtZVtncmVwbCgicGVhayIsIEc0cHJlZF9iZWQkbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIkc0ZXhwIgoKdGFibGUoRzRwcmVkX2JlZCRuYW1lKQpgYGAKCmBgYHtyfQpuZWFyZXN0X0c0XzBrYiA8LSBiZWRzY291dDo6YW5ub3RhdGVfbmVhcmJ5X2ZlYXR1cmVzKAogIGN0Y2YsCiAgRzRwcmVkX2JlZCwKICBkaXN0YW5jZV9jdXRvZmYgPSAwLAogIGlnbm9yZS5zdHJhbmQgPSBULAogIG5hbWVfZmllbGQgPSAibmFtZSIKKQpuZWFyZXN0X0c0XzFrYiA8LSBiZWRzY291dDo6YW5ub3RhdGVfbmVhcmJ5X2ZlYXR1cmVzKAogIGN0Y2YsCiAgRzRwcmVkX2JlZCwKICBkaXN0YW5jZV9jdXRvZmYgPSAxMDAwLAogIGlnbm9yZS5zdHJhbmQgPSBULAogIG5hbWVfZmllbGQgPSAibmFtZSIKKQpuZWFyZXN0X0c0XzIuNWtiIDwtIGJlZHNjb3V0Ojphbm5vdGF0ZV9uZWFyYnlfZmVhdHVyZXMoCiAgY3RjZiwKICBHNHByZWRfYmVkLAogIGRpc3RhbmNlX2N1dG9mZiA9IDI1MDAsCiAgaWdub3JlLnN0cmFuZCA9IFQsCiAgbmFtZV9maWVsZCA9ICJuYW1lIgopCm5lYXJlc3RfRzRfNWtiIDwtIGJlZHNjb3V0Ojphbm5vdGF0ZV9uZWFyYnlfZmVhdHVyZXMoCiAgY3RjZiwKICBHNHByZWRfYmVkLAogIGRpc3RhbmNlX2N1dG9mZiA9IDUwMDAsCiAgaWdub3JlLnN0cmFuZCA9IFQsCiAgbmFtZV9maWVsZCA9ICJuYW1lIgopCm5lYXJlc3RfRzRfMTBrYiA8LSBiZWRzY291dDo6YW5ub3RhdGVfbmVhcmJ5X2ZlYXR1cmVzKAogIGN0Y2YsCiAgRzRwcmVkX2JlZCwKICBkaXN0YW5jZV9jdXRvZmYgPSAxMDAwMCwKICBpZ25vcmUuc3RyYW5kID0gVCwKICBuYW1lX2ZpZWxkID0gIm5hbWUiCikKCgpjdGNmJG5lYXJlc3RfRzQgPC0gZmFjdG9yKCI+MTBrYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMGtiIiwgIjwxa2IiLCAiPDIuNWtiIiwgIjw1a2IiLCAiPDEwa2IiLCAiPjEwa2IiKSkKY3RjZiRuZWFyZXN0X0c0WyFpcy5uYShuZWFyZXN0X0c0XzEwa2IkbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIjwxMGtiIgpjdGNmJG5lYXJlc3RfRzRbIWlzLm5hKG5lYXJlc3RfRzRfNWtiJG5lYXJieV9mZWF0dXJlcyldIDwtICI8NWtiIgpjdGNmJG5lYXJlc3RfRzRbIWlzLm5hKG5lYXJlc3RfRzRfMi41a2IkbmVhcmJ5X2ZlYXR1cmVzKV0gPC0gIjwyLjVrYiIKY3RjZiRuZWFyZXN0X0c0WyFpcy5uYShuZWFyZXN0X0c0XzFrYiRuZWFyYnlfZmVhdHVyZXMpXSA8LSAiPDFrYiIKY3RjZiRuZWFyZXN0X0c0WyFpcy5uYShuZWFyZXN0X0c0XzBrYiRuZWFyYnlfZmVhdHVyZXMpXSA8LSAiMGtiIgoKcmVzdWx0cyRuZWFyZXN0X0c0IDwtIGN0Y2YkbmVhcmVzdF9HNAp0YWJsZShyZXN1bHRzJG5lYXJlc3RfRzQpCnRhYmxlKHJlc3VsdHMkbmVhcmVzdF9HNCwgcmVzdWx0cyRwcm8pCmBgYAoKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTJ9Cm1kZiA8LSByZXNoYXBlMjo6bWVsdCh0YWJsZShyZXN1bHRzJG5lYXJlc3RfRzQsIHJlc3VsdHMkcHJvKSkKZ2dwbG90KG1kZiwgYWVzKFZhcjEsIFZhcjIsIGZpbGwgPSB2YWx1ZSkpICsKICBnZW9tX3RpbGUoc2hvdy5sZWdlbmQgPSBGKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAib3JhbmdlIikgKyB0aGVtZV9taW5pbWFsKCkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1IZWF0bWFwX0NUQ0Zfc2l0ZXNfYnlfcHJlZEc0ZGlzdGFuY2UucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2d2aW9saW4oCiAgcmVzdWx0cywKICB4ID0gIm5lYXJlc3RfRzQiLAogIHkgPSAibWVhbi5tb2NrIiwKICBmaWxsID0gbXlwYWxbMV0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTApKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3R0ZWQiKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKAogICAgYWVzKGdyb3VwID0gbmVhcmVzdF9HNCksCiAgICBsYWJlbC55ID0gOCwKICAgIGxhYmVsLnggPSAyLAogICAgc2l6ZSA9IDMKICApCmdnc2F2ZShnbHVlKAogICJ7cGxvdF9mb2xkZXJ9VmlvbGluX0NUQ0Zfc2lnbmFsX2J5X3ByZWRHNGRpc3RhbmNlLnBkZiIpLAogIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAibmVhcmVzdF9HNCIsCiAgeSA9ICJkZXNlcS5sZmMucGRzIiwKICBmaWxsID0gbXlwYWxbMV0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMS41KSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSAwLjIpICsgZ2VvbV9obGluZSgKICB5aW50ZXJjZXB0ID0gbWVkaWFuKHJlc3VsdHMkZGVzZXEubGZjLnBkc1tyZXN1bHRzJG5lYXJlc3RfRzQgPT0gIjBrYiJdKSwKICBsaW5ldHlwZSA9ICJkb3R0ZWQiLAogIGxpbmV3aWR0aCA9IDAuMgopICsKICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwueSA9IDEuMywKICAgICAgICAgICAgICAgICAgICAgbGFiZWwueCA9IDMsCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyKQpnZ3NhdmUoZ2x1ZSgie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX1BEU19sZmNfYnlfcHJlZEc0ZGlzdGFuY2UucGRmIiksCiAgICAgICBwbG90ID0gbGFzdF9wbG90KCkpCmBgYApgYGB7cn0KY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRzIH4gbmVhcmVzdF9HNCwgcmVzdWx0cykKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAibmVhcmVzdF9HNCIsCiAgeSA9ICJkZXNlcS5sZmMucGRjIiwKICBmaWxsID0gbXlwYWxbMV0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMS41KSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSAwLjIpICsgZ2VvbV9obGluZSgKICB5aW50ZXJjZXB0ID0gbWVhbihyZXN1bHRzJGRlc2VxLmxmYy5wZGNbcmVzdWx0cyRuZWFyZXN0X0c0ID09ICIwa2IiXSksCiAgbGluZXR5cGUgPSAiZG90dGVkIiwKICBsaW5ld2lkdGggPSAwLjIKKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsLnkgPSAxLjMsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnggPSAzLAogICAgICAgICAgICAgICAgICAgICBzaXplID0gMikKZ2dzYXZlKGdsdWUoCiAgIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9QaGVuREMzX2xmY19ieV9wcmVkRzRkaXN0YW5jZS5wZGYiCiksCnBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRjIH4gbmVhcmVzdF9HNCwgcmVzdWx0cykKCmBgYApgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD0zfQpnZ3Zpb2xpbigKICByZXN1bHRzLAogIHggPSAibmVhcmVzdF9HNCIsCiAgeSA9ICJkZXNlcS5sZmMucGRzIiwKICBmaWxsID0gInBybyIsCiAgcGFsZXR0ZSA9IG15cGFsW2MoMSwgMywgNSldLAogIGFkZCA9ICJtZWRpYW5faXFyIgopICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDEuNSkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXdpZHRoID0gMC4yKSArIGdlb21faGxpbmUoCiAgeWludGVyY2VwdCA9IG1lYW4ocmVzdWx0cyRkZXNlcS5sZmMucGRzW3Jlc3VsdHMkbmVhcmVzdF9HNCA9PSAiMGtiIl0pLAogIGxpbmV0eXBlID0gImRvdHRlZCIsCiAgbGluZXdpZHRoID0gMC4yCikgKwogIHN0YXRfY29tcGFyZV9tZWFucyhhZXMoZ3JvdXAgPSBwcm8pLAogICAgICAgICAgICAgICAgICAgICBsYWJlbC55ID0gMS4zLAogICAgICAgICAgICAgICAgICAgICBsYWJlbC54ID0gMywKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSkKZ2dzYXZlKGdsdWUoIntwbG90X2ZvbGRlcn1WaW9saW5fQ1RDRl9QRFNfbGZjX2J5X3ByZWRHNGRpc3RhbmNlX3Byby5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKYGBge3J9CmNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IG5lYXJlc3RfRzQsIHJlc3VsdHNbcmVzdWx0cyRwcm8gPT0gIm5vUHJvIiwgXSkKY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRzIH4gbmVhcmVzdF9HNCwgcmVzdWx0c1tyZXN1bHRzJHBybyA9PSAibm9Qcm8iLCBdKSAlPiUKd3JpdGVfdHN2KC4sICJwZHNfRzRkaXN0YW5jZV9wbG90cy1ub1Byby1zdGF0aXN0aWNzLnRzdiIpCiAgCmBgYApgYGB7cn0KY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRzIH4gbmVhcmVzdF9HNCwgcmVzdWx0c1tyZXN1bHRzJHBybyA9PSAiUHJvIiwgXSkgJT4lCiAgd3JpdGVfdHN2KC4sCiAgICAgICAgICAgIGdsdWUoIntzdGF0X291dHB1dH1wZHNfRzRkaXN0YW5jZV9wbG90cy1Qcm8tc3RhdGlzdGljcy50c3YiKSkKCmNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IHBybywgZ3JvdXAuYnkgPSAibmVhcmVzdF9HNCIsIHJlc3VsdHMpICU+JQogIHdyaXRlX3RzdiguLAogICAgICAgICAgICBnbHVlKAogICAgICAgICAgICAgICJ7c3RhdF9vdXRwdXR9cGRzX0c0ZGlzdGFuY2VfcGxvdHMtYmV0d2Vlbl9wcm9tX3R5cGVzX3N0YXRzLnRzdiIKICAgICAgICAgICAgKSkKCmNvbXBhcmVfbWVhbnMoZGVzZXEubGZjLnBkcyB+IG5lYXJlc3RfRzQsIGdyb3VwLmJ5ID0gInBybyIsIHJlc3VsdHMpICU+JQogIHdyaXRlX3RzdiguLAogICAgICAgICAgICBnbHVlKAogICAgICAgICAgICAgICJ7c3RhdF9vdXRwdXR9cGRzX0c0ZGlzdGFuY2VfcGxvdHMtd2l0aGluX3Byb21fdHlwZXNfc3RhdHMudHN2IgogICAgICAgICAgICApKQoKYGBgCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTN9CmdndmlvbGluKAogIHJlc3VsdHMsCiAgeCA9ICJuZWFyZXN0X0c0IiwKICB5ID0gImRlc2VxLmxmYy5wZGMiLAogIGZpbGwgPSAicHJvIiwKICBwYWxldHRlID0gbXlwYWxbYygxLCAzLCA1KV0sCiAgYWRkID0gIm1lZGlhbl9pcXIiCikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTAuNSwgMS41KSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPSAwLjIpICsgZ2VvbV9obGluZSgKICB5aW50ZXJjZXB0ID0gbWVhbihyZXN1bHRzJGRlc2VxLmxmYy5wZGNbcmVzdWx0cyRuZWFyZXN0X0c0ID09ICIwa2IiXSksCiAgbGluZXR5cGUgPSAiZG90dGVkIiwKICBsaW5ld2lkdGggPSAwLjIKKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGFlcyhncm91cCA9IHBybyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnkgPSAxLjMsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnggPSAzLAogICAgICAgICAgICAgICAgICAgICBzaXplID0gMS41KQpnZ3NhdmUoZ2x1ZSgKICAie3Bsb3RfZm9sZGVyfVZpb2xpbl9DVENGX1BoZW5EQzNfbGZjX2J5X3ByZWRHNGRpc3RhbmNlX3Byby5wZGYiCiksCnBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgpgYGB7cn0KY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRjIH4gbmVhcmVzdF9HNCwgcmVzdWx0c1tyZXN1bHRzJHBybyA9PSAibm9Qcm8iLCBdKSAlPiUKICB3cml0ZV90c3YoLiwKICAgICAgICAgICAgZ2x1ZSgKICAgICAgICAgICAgICAie3N0YXRfb3V0cHV0fXBoZW5kY19HNGRpc3RhbmNlX3Bsb3RzLW5vUHJvLXN0YXRpc3RpY3MudHN2IgogICAgICAgICAgICApKQoKY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRjIH4gcHJvLCBncm91cC5ieSA9ICJuZWFyZXN0X0c0IiwgcmVzdWx0cykgJT4lCiAgd3JpdGVfdHN2KC4sCiAgICAgICAgICAgIGdsdWUoCiAgICAgICAgICAgICAgIntzdGF0X291dHB1dH1waGVuZGNfRzRkaXN0YW5jZV9wbG90cy1iZXR3ZWVuX3Byb21fdHlwZXNfc3RhdHMudHN2IgogICAgICAgICAgICApKQoKY29tcGFyZV9tZWFucyhkZXNlcS5sZmMucGRjIH4gbmVhcmVzdF9HNCwgZ3JvdXAuYnkgPSAicHJvIiwgcmVzdWx0cykgJT4lCiAgd3JpdGVfdHN2KC4sCiAgICAgICAgICAgIGdsdWUoCiAgICAgICAgICAgICAgIntzdGF0X291dHB1dH1waGVuZGNfRzRkaXN0YW5jZV9wbG90cy13aXRoaW5fcHJvbV90eXBlc19zdGF0cy50c3YiCiAgICAgICAgICAgICkpCgoKYGBgCg==